super() woes (n00b)

Jean-Michel Pichavant jeanmichel at sequans.com
Fri Jun 18 10:40:03 EDT 2010


Deadly Dirk wrote:
> On Fri, 18 Jun 2010 11:19:56 +0200, 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.
>>
>> 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)
>>
>>
>> JM
>>     
>
> Jean-Michel, thanks for your advice. I do think that I understand the 
> "super" function, I used to do some C++ programming and am quite adept at 
> programming. I am learning Python and, as a stickler for details, I am 
> testing and running every little piece of code.
>
>   
Quote from a c++ forum "There is no way (IMO) to generally refer to the 
superclass in C++ because of multiple inheritance".
Python super funtion is different from the Java's one, (there's no 
multiple inheritance in Java if I'm not wrong).

Think about this :

        A
       /  \
      B   C
       \  /
        D

python 2.5 code:

class A(object):
    def foo(self):
        print 'I am A'

class B(A):
    def foo(self):
        super(B, self).foo()
        print 'I am B'

class C(A):
    def foo(self):
        super(C, self).foo()
        print 'I am C'

class D(B,C):
    def foo(self):
        super(D, self).foo()
        print 'I am D'

d = D()
d.foo()

What would you expect as a result ? Diffcult to say at first glance.

JM

PS : answer is
I am A
I am C
I am B
I am D

As you can see, super() is *not* the superclass otherwise 'I am A' 
should have appeared twice (superclass method of B and C).





More information about the Python-list mailing list