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"? No, because they're entirely unrelated except that they inherit from 'object'. The superclass of 'A' is 'object'. 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'. You seem to be saying that now suddenly D *is* a superclass of A. That's certainly not what users will think of when they think "superclass" though. > > 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. > > No, super really does return a class. What makes you think that > super returns a special sort of object? >>> super(A) <super: <class 'A'>, NULL> >>> super(A).__class__ <type 'super'> What I expect, incidentally, is that a function documented as "returns the superclass of 'type'" would actually return that class (in this case, the type 'object'), not an object of 'super' type. > > After reading the rest of the article, I'm amazed that 'super' as > > currently implemented is in Python at all. I agree with the author > > that it's useless unless *everyone* uses it for *everything*, and > > even then it's pretty limited. > > I don't see what the problem is. If you don't use super, then you can > break the inheritance chain I don't want to break the inheritance chain. I want the superclass, not the "next class in the MRO". 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'". Am I mistaken in thinking that "superclass of foo" is equivalent to "parent class of foo"? If so, I'd lay heavy odds that I'm not alone in that thinking. -- \ "Laugh and the world laughs with you; snore and you sleep | `\ alone." —anonymous | _o__) | Ben Finney -- http://mail.python.org/mailman/listinfo/python-list