On Mon, 31 Dec 2007 16:19:11 -0800, Scott David Daniels wrote: > Steven D'Aprano wrote: >> On Mon, 31 Dec 2007 08:03:22 -0800, Scott David Daniels wrote: >>> Steven D'Aprano wrote: ... >>>> def chain(meth): # A decorator for calling super. >>>> def f(self, *args, **kwargs): >>>> result = meth(self, *args, **kwargs) >>>> S = super(self.__class__, self) >>> This line is the problem. The class parameter needs to be the class >>> (B in this case) in which the chaining method is defined, not that of >>> the object itself. >> One minor correction: the class parameter needs to be the class >> *itself*, not the class *name* (which would be the string "B"). > Point taken. > >> I don't quite understand your description though. What do you mean "the >> chaining method is defined"? chain() is defined outside of a class. > > The class where f (the chaining method) is defined; equivalently, the > class in which the @chain is used.
So why doesn't self.__class__ work? That's the class in which @chain is used. I can clearly see that it doesn't work, I just don't understand why. I'd be inclined to chalk it up to super() being a mysterious black box that makes no sense *wink* except that the following decorator also doesn't work: def chain(meth): # A decorator for not calling super. def f(self, *args, **kwargs): result = meth(self, *args, **kwargs) S = self.__class__.__base__ getattr(S, meth.__name__)(self, *args, **kwargs) return result return f -- Steven -- http://mail.python.org/mailman/listinfo/python-list