[EMAIL PROTECTED] wrote: > Jason Lai wrote: > >>If you use a newstyle class, e.g. class A(object), then you can get the >>superclass with cls.__base__. You could also use super(cls,cls), >>although note that it returns a <super> object that isn't exactly the >>same thing as a class -- but good enough for just accessing attributes. >> >>Make sure to check that your superclass isn't <object>, otherwise it'll >>complain about <object> not having a foo attribute. __base__ is >>probably easier for this purpose. Also be careful with multiple >>inheritance. >> >>No such thing as __super though. > > thanks, it works. Though I don't quite understand what super(cls,cls) > returns, and it doesn't work if I do a super(cls,cls).foo(). But > cls.__base__.foo() do the trick. > > thankfully, I don't have multiple inheritance. > > In point of fact super() is most useful when you *do* have multiple inheritance. The classic example is when classes B and C have a common supertype A, and then class D is a subclass of both B and C.
Under these circumstances (the so-called "diamond-shaped inheritance graph") it can be problematic to ensure that each superclass's methods are called exactly once when methods are being extended rather than overridden: should a D call B's method, which then calls A's, and if so how does a D ensure that C's method gets called without it also calling A's method. Calls to super() are used to effectively place a linearised oredering on the superclasses to ansure that the diamond-shaped inheritance pattern is correctly handled to give the correct method resolution order. regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC www.holdenweb.com PyCon TX 2006 www.python.org/pycon/ -- http://mail.python.org/mailman/listinfo/python-list