2013-05-28 54 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()的利益;你在本質上是「修復」父類,而不是等到運行時找到它。不過,這在多重繼承場景之外可能還不錯。