2012-04-08 3 views
2

데코레이터 기능이 있습니다. 클래스 내 함수에 적용하고 있습니다. 데코레이터는 _api 멤버 변수에 대한 검사를 수행해야합니다. 그러나이를 시도 할 때 global name 'self' is not defined 오류가 발생합니다. 올바른 방법은 무엇입니까?파이썬 클래스 내 데코레이터 함수 내에서 자체 액세스하기

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

인스턴스에 대한 참조는 self이 있음 아니다 래퍼 기능의 *args 그래서 이름입니다. args[0]를 사용하거나 단지로 재 작성 :이 작업을 수행 할 경우

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

은 물론, 랩 된 기능을 통해 전화는 self을 포함해야한다.

+0

친절한 - 감사합니다 – Yarin

1

변경

if self._api is not None: 

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

args[0]self있다. hasattr은 속성을 확인하는 올바른 방법입니다.

존재하지 않는 속성에 액세스하려고 시도하면 (self._api이없는 경우) AttributeError이 생성됩니다.

+1

고마워, 내 부분에 대한 잘못된 진술이었다. 비록 의견이 있어야한다. – Yarin

+0

@ 야린 : 의견은 무엇이되어야 하는가? –

+0

@JoelCornett : 편집 해 주셔서 감사합니다. 내가 똑같은 것을 쓸 준비를하고있는 것처럼 그것을 발견했다. :) –

관련 문제