2013-05-28 113 views
1

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

class Bar(Foo): 

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

因为我没有需要修改的aMethod的代码,有没有简单的装饰它,而无需办法明确不必调用super()

回答

4

您可以通过装饰版本替换方法猴补丁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) 
0

你可以做这样的事情:

class Bar(Foo): 

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

但是,你将失去的super()的利益;你在本质上是“修复”父类,而不是等到运行时找到它。不过,这在多重继承场景之外可能还不错。