【发布时间】:2020-07-09 10:49:15
【问题描述】:
我正在尝试应用conditional decorator,如另一篇 stackoverflow 帖子中所述,但我希望从正在使用的类内部设置条件。相反,我得到一个引用错误,指出 self 未定义。
class foo:
def __init__(self):
self.debug = True
@conditional_decorator(decorator, self.debug)
def function(self):
pass
我尝试定义一个全局变量并从 __init__() 方法内部对其进行更新,但它在作为装饰器的参数调用时保持其原始值。
debug = None
class foo:
def __init__(self):
self.debug = True
global debug
debug = self.debug
@conditional_decorator(decorator, debug)
def function(self):
pass
它起作用的唯一方法是声明一个全局变量并将其设置在类之外。
如何将类属性的值应用于装饰器?
【问题讨论】:
-
btw
decorators在 python 读取程序文本时应用,而不是在运行时。 -
@quamrana:不,装饰器是在函数定义时应用的。
-
Python 函数定义是命令式的——执行一个会生成一个新的函数对象。在此之后立即应用装饰器。当 Python 读取源代码时,它们不会也不能应用;此时没有函数对象可以传递给装饰器,也可能没有装饰器可以调用。
-
@quamrana 当
def语句被执行时,在运行时。 -
class语句也在运行时执行,这就是为什么类的主体不能引用类本身,因为该类还不存在而尸体正在被处决。