![](/img/trans.png)
[英]Python decorator within function, needs class within method?
[英]Accessing self within decorator function within a Python class
我有一个装饰器 function 我正在应用 class 中的函数。装饰器应该对_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):
...
对实例的引用在包装函数的*args
中,因此名称self
不可用。 使用args[0]
,或将其重写为:
def wrapper(self, *args, **kwargs):
# ...
自然地,如果您这样做,您对包装的 function 的调用也应该包括self
。
改变
if self._api is not None:
到
if hasattr(args[0], '_api'):
args[0]
有self
。 hasattr
是检查属性的正确方法。
如果您尝试访问不存在的属性,(如果self._api
不存在)您将生成一个AttributeError
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.