2012-04-08 54 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