using super

Arnaud Delobelle arnodel at googlemail.com
Mon Jan 18 15:19:40 EST 2010


Jean-Michel Pichavant <jeanmichel at sequans.com> writes:

[...]
> Then is there a reason why
>>>> return super(Subclass, self).parrot()
> would be prefered over the "classic" 
>>>> return Base.parrot(self) 
> ?
>
> Or is it just a matter of preference ?

Using super() calls the next method in the class's Method Resolution
Order (mro - to see it on class A, use A.mro()).  This guarantees that
ancestor methods won't be called twice when the inheritance graph is not
a tree.  Here is a (minimal?) example.

>>> class A(object):
...     def foo(self): print 'A'
... 
>>> class B(A):
...     def foo(self):
...         super(B, self).foo()
...         print 'B'
... 
>>> class C(A):
...     def foo(self):
...         super(C, self).foo()
...         print 'C'
... 
>>> class D(B, C):
...     def foo(self):
...         super(D, self).foo()
...         print 'D'
... 
>>> d = D()
>>> d.foo()
A
C
B
D
>>> D.mro()
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>]

The reason why super() may be necessary is that if an object is an
instance of say class C, its method resolution order above class C is
not known at compile time.

HTH

-- 
Arnaud



More information about the Python-list mailing list