2012-04-08 58 views
2

我有一個裝飾函數,我正在將其應用於類中的函數。裝飾者應該對_api成員變量進行檢查。但是,當我嘗試執行此操作時,出現global name 'self' is not defined錯誤。什麼是正確的方法?在Python類中的裝飾函數中訪問自我

def requires_api(fn): 
    def wrapped(*args, **kwargs): 
     if self._api is not None: 
      return fn(*args, **kwargs) 
     else: 
      return None 
    return wrapped 


@requires_api  
def do_something(self): 
... 

回答

5

到您的實例的引用在您的包裝功能的*args所以名字self不avaialble。使用args[0],或者只是把它改寫爲:

def wrapper(self, *args, **kwargs): 
    # ... 

當然,如果你這樣做,通過對包裝的函數調用你應該還包括self

+0

kindall-有道理 - 謝謝 – Yarin 2012-04-08 16:26:58

1

變化

if self._api is not None: 

if hasattr(args[0], '_api'): 

args[0]selfhasattr是檢查屬性的正確方法。

如果您嘗試訪問不存在的屬性(如果self._api不存在),您將生成一個AttributeError

+1

謝謝你,你說的對,我的錯誤陳述 - 應該是一個評論,儘管 – Yarin 2012-04-08 16:26:33

+0

@Yarin:什麼應該是評論? – 2012-04-08 16:29:30

+0

@JoelCornett:感謝您的編輯。發現它就像我正在準備寫同樣的東西。 :) – 2012-04-08 16:31:23