From: Deadly Dirk on
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.




--
I don't think, therefore I am not.
From: Jean-Michel Pichavant on
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).


From: Ethan Furman on
Deadly Dirk wrote:
> On Thu, 17 Jun 2010 12:18:33 -0700, Ethan Furman wrote:
>
>> Deadly Dirk wrote:
>>> On Thu, 17 Jun 2010 13:48:45 -0400, J. Cliff Dyer wrote:
>>>
>>>> super gives you an instantiated version of the super class, which
>>>> means that you don't have to explicitly send self to any methods you
>>>> call on it.
>>>>
>>>> So use `super().__init__()` instead.
>>> Thanks. Interestingly enough, it works in Python 3, which is what the
>>> book is about. It doesn't work in Python 2.6
>> as Thomas Jollans said days ago:
>> > but you should really install Python 3.1 (it's in ubuntu, as others
>> > have said!) because you will almost certainly hit into other snags.
>>
>> or, as Gabriele Lanaro said in that same thread:
>> > else take a book that covers python 2.x syntax
>>
>> Cut-and-pasting-ly yours,
>>
>> ~Ethan~
>
> As you can see, I followed the advice and installed the latest Python.


So you did. My apologies.

~Ethan~