super() woes (n00b)

Lie Ryan lie.1296 at gmail.com
Fri Jun 18 06:14:11 EDT 2010


On 06/18/10 19:19, Jean-Michel Pichavant wrote:
> Deadly Dirk wrote:
>> I cannot get right the super() function:
>> Python 3.1.1+ (r311:74480, Nov  2 2009, 14:49:22) [GCC 4.4.1] on linux2
>> Type "copyright", "credits" or "license()" for more information.
>> ==== No Subprocess ====
>>  
>>>>> class P:
>>>>>         
>>     def __init__(__class__,self):
>>         print("I am a member of class P")
>>
>>          
>>>>> class C(P):
>>>>>         
>>     def __init__(self):
>>         super().__init__(self)
>>         print("I am a member of class C")
>>
>>        
>> class P:
>>     def __init__(self):
>>         print("I am a member of class P")
>>
>> class C(P):
>>     def __init__(self):
>>         super().__init__(self)
>>         print("I am a member of class C")
>>
>> x=C()
>>
>> That is more or less the text from the "Quick Python Book". What am I
>> doing wrong?
>>
>>   
> If you're quite new to Python I would advise to drop super and use an
> explicit call, sounds lame but my guess is that many people do that,
> 'cause explicit >> implicit. Super is meant to solve some issues about
> multi inheritance, especially diamond diagram inheritance. It has no
> benefit for single inheritance.

Actually there is. If you need to anticipate the possibility of someone
else (or you in the future)  multiply-inheriting from your
singly-inheriting class, then your singly-inheriting class would need to
use super as well, otherwise the multiply-inheriting class might not be
properly initialized.

> I'm pretty sure someone will state that understanding super is pretty
> much easy once you've read the documenation but anticipating all the
> underlying concepts may be tricky. The only situation where super is
> absolutely required is when the inheritance diagram is built dynamically
> during execution.
> Otherwise, I would say "Have the nuts to explicit which base class
> method you want to call" (easy for single inheritance though :) )
> 
> class C(P):
>    def __init__(self):
>       P.__init__(self)



More information about the Python-list mailing list