Prev: Efficiency/style issues of import <module> vs. from <module>import <name>, ...
Next: Efficiency/style issues of import <module> vs. from <module> import <name>, ...
From: Deadly Dirk on 18 Jun 2010 09:11 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 18 Jun 2010 10:40 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 18 Jun 2010 14:10
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~ |