我有一个装饰函数我正在应用于类中的函数。装饰者应该对_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):
...
答案 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]
有self
。 hasattr
是检查属性的正确方法。
如果您尝试访问不存在的属性(如果self._api
不存在),您将生成AttributeError
。