将装饰器附加到类中的所有函数上
问题内容:
我并不是真的需要这样做,但我只是想知道,是否有一种方法可以将装饰器一般地绑定到类中的所有函数,而不是为每个函数显式说明。
我想它然后成为一种方面,而不是装饰者,它的确有些奇怪,但是在考虑诸如计时或验证之类的事情时,它会很整洁。
问题答案:
进行此操作或对类定义进行其他修改的最简单方法是定义一个元类。
另外,只需在类定义的末尾应用装饰器即可:
class Something:
def foo(self): pass
for name, fn in inspect.getmembers(Something):
if isinstance(fn, types.UnboundMethodType):
setattr(Something, name, decorator(fn))
对于Python 3,请替换types.UnboundMethodType
为types.FunctionType
。
当然,在实践中,您将需要更选择性地应用装饰器。只要您要装饰除一种方法外的所有方法,您就会发现仅以传统方式使用装饰器语法会更轻松,更灵活。