装饰子类方法

时间:2013-05-28 19:53:26

标签: python decorator python-decorators

假设我有一个班级Foo。我写了一个装饰器deco我想应用于类Foo的一些方法。由于Foo是从库中导入的,因此我决定将其子类化为Bar。现在,我唯一需要做的就是将装饰器添加到Foo的某些方法中。

class Bar(Foo):

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

由于我不需要修改aMethod的代码,是否有更简单的方法来装饰它,而不需要明确地调用super()

2 个答案:

答案 0 :(得分:5)

您可以通过使用装饰版本替换方法来进行monkeypatch Foo

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)

答案 1 :(得分:0)

您可以这样做:

class Bar(Foo):

    aMethod = deco(Foo.aMethod)   # Foo.aMethod.im_func in Py2.x

然而,你将失去super()的好处;你基本上是“固定”父类,而不是等到运行时才能找到它。但是,在多重继承方案之外,这可能很好。