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