将装饰器附加到类中的所有函数上


问题内容

我并不是真的需要这样做,但我只是想知道,是否有一种方法可以将装饰器一般地绑定到类中的所有函数,而不是为每个函数显式说明。

我想它然后成为一种方面,而不是装饰者,它的确有些奇怪,但是在考虑诸如计时或验证之类的事情时,它会很整洁。


问题答案:

进行此操作或对类定义进行其他修改的最简单方法是定义一个元类。

另外,只需在类定义的末尾应用装饰器即可:

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.UnboundMethodTypetypes.FunctionType

当然,在实践中,您将需要更选择性地应用装饰器。只要您要装饰除一种方法外的所有方法,您就会发现仅以传统方式使用装饰器语法会更轻松,更灵活。