It does not return them at once. It returns them piece by piece: [EMAIL PROTECTED]:/tmp> cat mro.py class A(object): v=lambda self: "A" class B(object): v=lambda self: "B" class C(B,A): v=lambda self: "C"
print C.__mro__ c=C() print c.v() print super(C, c).v() print super(B, c).v() [EMAIL PROTECTED]:/tmp> python2.5 mro.py (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <type 'object'>) C B A Andreas Am Freitag, den 21.03.2008, 23:11 -0500 schrieb tiger12506: > Woah. Either you're leaving out essential info, or python got a lot more > complicated. > > Firstly, super returns all base classes. How? Does it return a tuple of > them, or a container object, or is this something horribly worse such as > syntactic sugar? > > It doesn't make sense for it to return a tuple, then super().__init__ would > call the init method of the tuple, not each class, so then syntactic sugar > would have to be involved. I doubt that.. > > A container object could use __getattr__ to magically call each of the > __init__ methods of the contained class references. > The most logical is the container object. But that leaves things open for > duplicate calls to __init__ > So the container would have to keep track of the base classes it has already > called... which might be the ordered list __mro__, but those are class > specific, not global, so each super class would not know if an __init__ has > been called or not... But then again, you would need duplicate calls because > each level of super would need different initiation. > > I apologize. Would you care to explain this a little more technically? > Specific and accurate are better than translated into layman's terms. I've > been with python for a while now. thanks. > > >Actually, super returns all base classes, all in it's own time. > > > >Basically, every class has a member __mro__, that contains a > >consistently ordered list of classes. > > > >super needs the class from where it is being called to locate the right > >place in the __mro__ and to hand you a wrapper around self for the next > >base class in this list. > > > >This way, if all classes use super, they can cooperativly call all > >implementations of a given method. > > > >That's the theory. In practice there are a number of pitfalls which > >makes super problematic. ;) > > > >Andreas > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor