假设我有一个班级Foo
。我写了一个装饰器deco
我想应用于类Foo
的一些方法。由于Foo
是从库中导入的,因此我决定将其子类化为Bar
。现在,我唯一需要做的就是将装饰器添加到Foo
的某些方法中。
class Bar(Foo):
@deco
def aMethod(self, *args, **kwargs):
super().aMethod(*args, **kwargs)
由于我不需要修改aMethod
的代码,是否有更简单的方法来装饰它,而不需要明确地调用super()
?
答案 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()
的好处;你基本上是“固定”父类,而不是等到运行时才能找到它。但是,在多重继承方案之外,这可能很好。