假设我有一个类Foo。我写了一个decoratordeco我想应用到类的一些方法上。因为Foo是从库中导入的,所以我决定将其子类化为Foo。现在,我只需要将decorator添加到Bar的一些方法中。

class Bar(Foo):

    @deco
    def aMethod(self, *args, **kwargs):
        super().aMethod(*args, **kwargs)

既然我不需要修改Foo的代码,有没有一种更简单的方法来修饰它,而不需要显式地调用aMethod

最佳答案

您可以通过将方法替换为修饰版本来monkeypatchFoo

Foo.aMethod = deco(Foo.aMethod)

Decorator语法只是语法糖,毕竟,deco只是一个可调用的函数,其结果将替换decorated函数:
@deco
def aMethod(...):
    ....

有效翻译为:
def aMethod(....):
    ...
aMethod = deco(aMethod)

或者,如果您仍希望使用子类,请在类的主体中执行相同的操作:
class Bar(Foo):
    aMethod = deco(Foo.aMethod)

在Python2中,需要先打开函数:
Foo.aMethod = deco(Foo.aMethod.im_func)

关于python - 装饰子类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16800335/

10-09 16:37