2013-02-07 88 views
2

如何在python成員函數裝飾器中使用實例作爲參數。 以下是一個例子。Python成員函數裝飾器使用實例作爲參數

def foo(func): 
    def wrap(s): 
     func() 
     s.ma() 
    return wrap 

class A: 
    def ma(self): 
     print "this is ma" 

    @foo(self)  #error.name 'self' is not defined 
    def mb(self): 
     print "this is mb" 
+2

您不能這樣做,因爲不僅在實例中,而且在類類正在執行時尚未定義類。你試圖完成什麼,使你認爲你需要這樣做? – BrenBarn

+1

此外,你的foo裝飾器沒有設置參數。你只是想在你的foo裝飾器函數中引用實例嗎? 'wrap'的參數's'將被綁定到實例,你應該像'func''一樣將它傳遞給'func'。 – Thomas

回答

1

目前尚不清楚你在找什麼,但如果你希望能夠使用參考實例你的裝飾裏面:

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?的了不起的答案,以更好地解釋發生了什麼事。