[Tutor] super constructor usage

Steven D'Aprano steve at pearwood.info
Wed Mar 29 21:29:00 EDT 2017


On Wed, Mar 29, 2017 at 10:32:52PM +0100, Alan Gauld via Tutor wrote:
> On 29/03/17 15:33, Rafael Knuth wrote:
> > I am trying to wrap my head around the super constructor. 
> 
> This is one of these cases where it matters whether you
> are using Python v2 or v3. Use of super in v3 is much
> easier. It looks from your examples like you are using
> v2 but it would be good to confirm that.

It can't be Python 2, because A doesn't inherit from object. In that 
case, B's attempt to call super() would fail.

[...]
> > That works, however I am not sure about what exactly happens inside the code.
> 
> Yes, you have the mechanism right.
> As to what exactly happens inside the interpreter I'll leave
> that for those who care about such things :-)

The only real magic here is in super(). Everything else is just normal 
calling methods with arguments.

What super() does is return a special object, let's call it S. When you 
call S.__init__, S is smart enough to ignore it's own __init__ method, 
and instead search B's inheritance chain (called the MRO, or Method 
Resolution Order), returning the first __init__ it finds.

For B, the MRO is really short: first it looks at class A, then it looks 
at A's parent, namely `object`, which is the ultimate top of all 
inheritance chains in Python 3.

But in general, the MRO might be very long, it might contain branches, 
and the same class might be included multiple times. By using super(), 
Python will ensure that each superclass method is called at most *one* 
time, in the right order, no matter how many superclasses are involved.



-- 
Steve


More information about the Tutor mailing list