目前,我有下面的代碼,它使用一個Python庫:發送一條蟒蛇裝飾方法作爲函數參數
f = Foo(original_method, parameters)
我想增加original_method,並有裝飾添加幾行代碼。我們來調用新的裝飾方法decorated_method。最後我想有這樣的事情:
f = Foo(decorated_method(original_method), parameters)
我的問題是:這可能嗎?裝飾工看起來如何? 我必須說我無法擴展original_method,因爲它是外部庫的一部分。
編輯:original_method不執行,只傳遞給Foo作爲參數。 decorated_method函數應該執行一些日誌記錄並收集一些調用次數的統計信息。
稍後編輯:以下示例中的代碼正常工作。我有一些額外的問題,因爲original_method有幾個屬性,所以這是最後的代碼:
def decorated_method(method):
def _reporter(*args, **kwargs):
addmetric('apicall', method.__name__)
return method(*args, **kwargs)
_reporter.original_method_attribute = method.original_method_attribute
return _reporter
到目前爲止發佈的兩個答案都回答你的問題,但你的編輯說你還沒有理解他們。試試建議的內容,看看會發生什麼。裝飾器用一個包裝原始的新函數替換你的original_method。當新功能被調用時,它可以收集統計數據,然後調用原始數據。 'original_method'不被裝飾器調用,只有當'Foo'裏面的代碼調用它時。 – Duncan 2012-07-11 11:48:01
我終於明白了。謝謝! – Alex 2012-07-11 12:08:37