在Python类中访问decorator函数中的self
我有一个decorator函数,我正在应用于类中的函数。装饰程序应该对在Python类中访问decorator函数中的self,python,scope,decorator,Python,Scope,Decorator,我有一个decorator函数,我正在应用于类中的函数。装饰程序应该对\u api成员变量进行检查。但是,当我尝试执行此操作时,会出现一个全局名称“self”未定义的错误。正确的方法是什么 def requires_api(fn): def wrapped(*args, **kwargs): if self._api is not None: return fn(*args, **kwargs) else:
\u api
成员变量进行检查。但是,当我尝试执行此操作时,会出现一个全局名称“self”未定义的错误。正确的方法是什么
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):
# ...
当然,如果您这样做,您对包装函数的调用也应该包括self
更改
if self._api is not None:
到
args[0]
具有self
。是检查属性的正确方法
如果您试图访问一个不存在的属性,(如果self.\u api
不存在),您将生成一个AttributeError
谢谢,您是对的,这是我的一个错误声明-应该是一个注释though@Yarin:应该发表什么评论?@JoelCornett:谢谢你的编辑。就在我正准备写同样的东西时发现的。:)@史蒂文鲁巴尔斯基:没问题。通常情况就是这样:)
if hasattr(args[0], '_api'):