On 7/16/06, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote: > For about the third time in my life, I thought I might > have found a use for cooperative super calls, but I've > run into another problem with the concept. > > Consider: > > class A(object): > def m(self): > print "A.m" > > class B(object): > def m(self): > print "B.m" > super(B, self).m() > > class C(B, A): > def m(self): > print "C.m" > super(C, self).m() > > >>> c = C() > >>> c.m() > C.m > B.m > A.m > > Okay so far, but... what if I want to use class B on > its own, or in combination with other classes that don't > have an m() method? > > >>> b = B() > >>> b.m() > B.m > Traceback (most recent call last): > File "<stdin>", line 1, in ? > File "<stdin>", line 4, in m > AttributeError: 'super' object has no attribute 'm' > > In general, how is one supposed to use super() in a > class which may or may not be at the end of the mro > with respect to a particular method? One isn't. In the world where cooperative multiple inheritance originated (C++), this would be a static error. You can only use super when you're overriding a method, not when you're defining a new method. To do what you want to do in such a world, you'd have to create a base class with a dummy implementation and inherit from that. You can do that in Python, too. > The only thing I can think of is to write all my > super()-using methods defensively like this: > > def m(self): > ... > s = super(C, self) > if hasattr(s, 'm'): > s.m() > > which seems awfully tedious. Definitely don't that. -- --Guido van Rossum (home page: http://www.python.org/~guido/)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4