This works as expected:
>>> class Foo(object): ... @classmethod ... def hello(cls): ... print 'hello, foo' ... >>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... super(Bar, cls).hello() ... >>> b = Bar() >>> b.hello() hello, bar hello, foo I can also call the base class explicitly:
>>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... Foo.hello() ... >>> b = Bar() >>> b.hello() hello, bar hello, foo I was wondering why I can't omit the first argument to super, like this:
>>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... super(Bar).hello() ... >>> b = Bar() >>> b.hello() hello, bar Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in hello AttributeError: 'super' object has no attribute 'hello' when the result of the super call without a second argument seems to be a class type inside a super type:
>>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print Foo, type(Foo) ... print super(Bar), type(super(Bar)) ... print cls, type(cls) ... >>> b = Bar() >>> b.hello() <class '__main__.Foo'> <type 'type'> <super: <class 'Bar'>, NULL> <type 'super'> <class '__main__.Bar'> <type 'type'> I guess I'm just wondering about the design here. Why would I need to pass the class object into the super call to get a reference to the base class type Foo? For a normal method, it makes sense to pass self to the function, since it needs to bind the base class type to an actual instance of the class. But a classmethod doesn't need a specific instance of the class.
EDIT: I get the same error in Python 3.2 as I do above in 2.7 for super(Bar).hello(). However, I can simply do super().hello() and that works fine.
__class__scoped variable so you can omit the arguments andsuper()will inspect the calling frame to grab both the type and the bind argument (selforcls).