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).


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to