目前尚不清楚你在找什麼,但如果你希望能夠使用參考實例你的裝飾裏面:
def foo(func):
def wrap(s): # I'd call this 'self' instead of 's' to remind us it's a reference to an instance
func(s) # This is a function, not a method yet - so we need to pass in the reference
s.ma() # This is a method, because you use attribute lookup on the object s to get it
return wrap
class A:
def ma(self):
print "this is ma"
@foo # if the way foo wraps mb doesn't depend on some arg, don't use args here
def mb(self):
print "this is mb"
我想你困惑在這裏約Python中的方法和函數之間的差異 - 你似乎期望func
將像一個方法一樣工作,實際上它在裝飾時仍然是一個函數。這是裝飾函數,將在實例的屬性查找中轉化爲方法;這意味着當您在包裝函數中調用func
時,您仍然需要明確的自我。
請參閱How to make a chain of function decorators?的了不起的答案,以更好地解釋發生了什麼事。
您不能這樣做,因爲不僅在實例中,而且在類類正在執行時尚未定義類。你試圖完成什麼,使你認爲你需要這樣做? – BrenBarn
此外,你的foo裝飾器沒有設置參數。你只是想在你的foo裝飾器函數中引用實例嗎? 'wrap'的參數's'將被綁定到實例,你應該像'func''一樣將它傳遞給'func'。 – Thomas