0
考慮這個例子:的Python:重寫一個未知的類
x = a.some_class_instance
x.foo()
我想裝飾x.foo()
沿
@x.foo()
def dec()
print 'decorator'
x.foo()
線的東西反正有做到這一點? 謝謝:)
考慮這個例子:的Python:重寫一個未知的類
x = a.some_class_instance
x.foo()
我想裝飾x.foo()
沿
@x.foo()
def dec()
print 'decorator'
x.foo()
線的東西反正有做到這一點? 謝謝:)
簡單的方法是做到這一點:
x.foo = dec(x.foo)
另一種方式是擴展實例的類
x = a.some_class_instance
class Extended(x.__class__):
@dec
def foo(...):
...
,但我看不出有什麼好的理由這樣做。
以下代碼
@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)
我不明白如何裝飾()會在那個例子中被稱爲?我將如何訪問x的命名空間? –
@Tony Medeiros:我的不好; 'decorate'函數應該返回一個對'裝飾'的引用(固定)。你是對的,在這個例子中,'裝飾的'不能訪問x的名字空間。但它可以通過傳遞給'decorate'的'f'參數來訪問舊的'x.foo',這是您需要的全部示例。如果你想訪問所有的x的命名空間,那麼你必須將x作爲參數傳遞給'decorate'。 – Ponkadoodle