假设我有一堂课Foo
.我写了一个装饰器,deco
我想申请一些类的方法Foo
.既然Foo
从库中导入,我决定将其子类化为Bar
.现在,我唯一需要做的就是将装饰器添加到某些方法中Foo
.
class Bar(Foo): @deco def aMethod(self, *args, **kwargs): super().aMethod(*args, **kwargs)
由于我不需要修改代码aMethod
,有没有更简单的方法来装饰它,而不需要明确地调用super()
?
你可以Foo
通过用装饰版本替换方法来monkeypatch :
Foo.aMethod = deco(Foo.aMethod)
装饰器语法只是语法糖,毕竟deco
只是一个可调用的,其结果取代了修饰函数:
@deco def aMethod(...): ....
被有效地翻译成:
def aMethod(....): ... aMethod = deco(aMethod)
或者,如果您仍然喜欢使用子类,请在类的主体中执行相同的操作:
class Bar(Foo): aMethod = deco(Foo.aMethod)
在Python 2中,您需要首先解开函数:
Foo.aMethod = deco(Foo.aMethod.im_func)