在Python类中访问装饰器函数内的self

时间:2012-04-08 16:11:40

标签: python scope decorator

我有一个装饰函数我正在应用于类中的函数。装饰者应该对_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):
...

2 个答案:

答案 0 :(得分:5)

对您的实例的引用位于您的包装函数*args中,因此名称self不可用。使用args[0],或者只将其重写为:

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

当然,如果你这样做,你对包装函数的调用也应包括self

答案 1 :(得分:1)

更改

if self._api is not None:

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

args[0]selfhasattr是检查属性的正确方法。

如果您尝试访问不存在的属性(如果self._api不存在),您将生成AttributeError