使用遍历类属性并装饰可调用函数的函数来装饰类。如果您有可能恰好可以调用的类变量,并且还会修饰嵌套的类(请感谢Sven
Marnach指出这一点),那么这可能是错误的做法,但是通常这是一个非常干净且简单的解决方案。示例实现(请注意,这不会排除
__init__可能需要或可能不需要的特殊方法(等)):
def for_all_methods(decorator): def decorate(cls): for attr in cls.__dict__: # there's propably a better way to do this if callable(getattr(cls, attr)): setattr(cls, attr, decorator(getattr(cls, attr))) return cls return decorate
像这样使用:
@for_all_methods(mydecorator)class C(object): def m1(self): pass def m2(self, x): pass ...
在Python 3.0和3.1中,
callable不存在。它在Python 2.x中一直存在,并且在Python
3.2中作为的包装器而返回
isinstance(x,collections.Callable),因此您可以
callable在那些版本中使用它(或使用此定义自己的替代品)。


![如何修饰一个类的所有功能而不用为每个方法一遍又一遍地键入它?[重复] 如何修饰一个类的所有功能而不用为每个方法一遍又一遍地键入它?[重复]](http://www.mshxw.com/aiimages/31/662701.png)
