Ben Finney a écrit : > Evan Klitzke <[EMAIL PROTECTED]> writes: > >> On Tue, 2007-09-18 at 14:15 +1000, Ben Finney wrote: >>> Why does the documentation of 'super' say that it returns the >>> superclass when *that's not true*? It doesn't return the >>> superclass, it returns the next class in the MRO, whether that's a >>> superclass or not. >> The next class in the MRO _is_ a superclass. Maybe not the way >> you've defined it in your own code, but certainly of the new class >> you created with MI. > > If I define a class hierarchy as follows:: > > class A(object): pass > class B(object): pass > class C(A): pass > class D(B): pass > > is it true to say that "D is a superclass of A"?
Obviously not. > How about this: > > class E(C, D): pass > > In this instance, the MRO now has D following A; but the superclass of > 'A' is still 'object'. Yes. And ? > > You seem to be saying that now suddenly D *is* a superclass of > A. I don't see such an assertion in Evan's answer. Chapter and verse ??? > That's certainly not what users will think of when they think > "superclass" though. If a class X is in the MRO of call Y, then X is a superclass of Y. I agree that the documentation for super is somewhat misleading (and obviously wrong), but it still *give access to* (at least one of) the superclass(es). >>> Actually, even that's not true. The error message "AttributeError: >>> 'super' object has no attribute 'bazfunc'" makes it clear that >>> 'super' actually returns not the superclass, but a 'super' object, >>> whatever that's supposed to be. The 'super' object is a wrapper around a class and an object. It delegates attribute lookups to appropriate superclass. >>> After reading the rest of the article, I'm amazed that 'super' as >>> currently implemented is in Python at all. If you have a better solution for handling multiple inheritence, please share with us. FWIW, after all the articles I've read explaining why Python is badly designed, badly implemented, and totally flawed, I do wonder why this language exists at all !-) > I don't want to break the inheritance chain. I want the superclass, A soon as you have either multiple inheritence and/or an inheritence tree with depth > 1, there's no such thing as "the" superclass. wrt/ your exemple, object, A, B, C and D are *all* superclasses of E. > not the "next class in the MRO". The next class in the MRO is (usually and AFAICT) the most direct superclass. > Orthogonally to that, I think it's madness to write a function for > "return the next class in the MRO for 'type'" and document it as > "return the superclass of 'type'". I wouldn't use such an extreme word as 'madness', but I totally agree that this should be corrected. Care to submit a doc patch ? -- http://mail.python.org/mailman/listinfo/python-list