Method resolution for super(Class, obj).
this at is.invalid
Thu Sep 7 21:05:10 CEST 2006
On 7 Sep 2006 10:42:54 -0700, in comp.lang.python you wrote:
>Let's examine what the mro order is for class D:
>[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
>n__.A'>, <type 'object'>]
>When you call d.met(), the call dispatches to the D.met() method.
>After printing out 'D.met', you use super() to get the next class in
>the mro order, and call that class's met method.
>As shown with the mro(), the class after D is B. So B.met() is called.
> Normally, we would be done. But take a look at B's method!
>> class B(A):
>> def met(self):
>> print 'B.met'
>B.met calls super, and invokes the next met method! So, the code does
>exactly what you've asked it to do, and searches for the next class
>after B in the mro list: class C.
But when super(B,self).met() is invoked, isn't it supposed to look
at MRO order of *B*, which is:
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
and B doesn't have any relation with C, that is: A's met() is the to
be called as a result. In effect, what you say impies that a call to
super() is context dependant - if super(B,self).met() is invoked as
a result of a call to D().met(), the effect is different from the effect
of a call to B().met(). But a documentation of a super() doesn't mention
anything like that (or at least I didn't find it), and it seems a
significant piece of information. Doesn't it imply that there should
be another explanation?
More information about the Python-list