> >I have the impression that this is supposed to call the f method >in both A and B, so it should print > > Not really true. The first parameter of 'super' should be a type, not an instance.
> A > B > C >or maybe > B > A > C >depending on the resolution order. However, it only calls A.f and not B.f. > >I also notice that if I say > > > class B(object): > def f(self): > super(B,self).f() > print 'b' > >then > test(B) >raises an exception since B has no superclass with an f method. > Correct. When you use super(B,self) it accesses the current instance as the class B. If it has no method named 'f' then this will end up in an exception. >That doesn't seem like such a good thing necessarily. > > But yes, it is. When you try to call a nonexistent method, it should raise an exception. >Anyway, is there a preferred way of writing this example so that C.f >automatically calls both A.f and B.f? > > I do not know a preferred way. However, I made this example for you, I hope it helps. class CallSupersMixin(object): def callsupers(self,fname,*args,**kwargs): l = self.__class__.__bases__ for cls in l: if hasattr(cls,fname): getattr(cls,fname)(self,*args,**kwargs) elif cls == CallSupersMixin: pass else: raise AttributeError("Base class %s does not have a method named %s " % ( str(cls),fname ) ) class A(object): def f(self): print 'A.f called' class B(object): def f(self): print 'B.f called' class AB(A,B,CallSupersMixin): def f(self,*args,**kwargs): self.callsupers('f',*args,**kwargs) ab = AB() ab.f() Of course you can remove the "raise AttributeError" part. Then it will call only the classes that have the given method. I know it is not a very good example but you can go from here. Best, Laci 2.0 -- _________________________________________________________________ Laszlo Nagy web: http://designasign.biz IT Consultant mail: [EMAIL PROTECTED] Python forever! -- http://mail.python.org/mailman/listinfo/python-list