繁体   English   中英

在 Python class 中访问装饰器 function 中的自我

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM