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):
...
4

2 回答 2

5

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

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

自然,如果您这样做,您对包装函数的调用也应该包括self.

于 2012-04-08T16:13:39.300 回答
1

改变

if self._api is not None:

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

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

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

于 2012-04-08T16:19:08.313 回答