tags:

views:

607

answers:

2

Consider the following code:

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

From Derived.do, how do I call Base.do? I would normally use super or even the base class name directly if this is a normal object method, but apparently I can't find a way to call the classmethod in the base class. In the above example, Base.do(a) prints Base class instead of Derived class.

+4  A: 
super(Derived, cls).do(a)

EDIT: Oh, wait a minute... it's not clear exactly what you're asking. This is how you would invoke the code in the base class's version of the method, from the derived class.

David Zaslavsky
uh uh .. how come it never occured to me that I can use `super` on classmethods too.
Sridhar Ratnakumar
A: 

This works for me:

Base.do('hi')
Ned Batchelder
The `cls` argument will then be bound to `Base` instead of `Derived`
Sridhar Ratnakumar