Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python类中访问decorator函数中的self_Python_Scope_Decorator - Fatal编程技术网

在Python类中访问decorator函数中的self

在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:

我有一个decorator函数,我正在应用于类中的函数。装饰程序应该对
\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'):