2011-09-01 26 views

回答

1

簡單的方法是做到這一點:

x.foo = dec(x.foo) 

另一種方式是擴展實例的類

x = a.some_class_instance 
class Extended(x.__class__): 
    @dec 
    def foo(...): 
     ... 

,但我看不出有什麼好的理由這樣做。

0

以下代碼

@decorator 
def decoratee(): 
    pass 

僅僅是爲了

def decoratee(): 
    pass 
decoratee = decorator(decoratee) 

速記裝飾器只是需要函數作爲參數並返回一個新的功能。

您的示例代碼編譯,實際上可以運行沒有錯誤,這取決於x.foo的作用。但我非常懷疑它會做你想要的。我認爲你想要的東西是沿線︰

def decorate(f): 
    def decorated(): 
     print 'decorator' 
     f() 
    return decorated 
x.foo = decorate(x.foo) 
+0

我不明白如何裝飾()會在那個例子中被稱爲?我將如何訪問x的命名空間? –

+0

@Tony Medeiros:我的不好; 'decorate'函數應該返回一個對'裝飾'的引用(固定)。你是對的,在這個例子中,'裝飾的'不能訪問x的名字空間。但它可以通過傳遞給'decorate'的'f'參數來訪問舊的'x.foo',這是您需要的全部示例。如果你想訪問所有的x的命名空間,那麼你必須將x作爲參數傳遞給'decorate'。 – Ponkadoodle