Nicolas Girard napisaĆ(a): > prepend(C.f,pre) This wraps f, returns wrapped and binds it to C.f (but the method.__name__ is still wrapped). > append(C.f,post) This wraps wrapped (the one previously returned), returns wrapped (a new one) and binds it to C.wrapped (since that is what its method.__name__ says). > C().f() If you try C().wrapped() it works as expected.
So the problem is in retaining the function name. Try: def append(method,bottom): def wrapped(*args, **kwargs): res = method(*args, **kwargs) return bottom(res,*args, **kwargs) wrapped.__name__ = method.__name__ setattr(method.im_class,method.__name__,wrapped) def prepend(method,top): def wrapped(*args, **kwargs): top(*args, **kwargs) return method(*args, **kwargs) wrapped.__name__ = method.__name__ setattr(method.im_class,method.__name__,wrapped) -- http://mail.python.org/mailman/listinfo/python-list