我刚才编码的问题的mwe:
from decorator import decorator
@decorator
def deco(func, deco_name=None, *args, **kwargs):
print(f"DECORATOR {deco_name} APPLIED")
return func(*args, **kwargs)
deco_name = None
class Greeter:
def __init__(self, _deco_name):
global deco_name
deco_name = _deco_name
@deco(deco_name=deco_name)
def hello(self, name):
print(f"Hello {name} :)")
print(deco_name)
g = Greeter("MYDECO")
g.hello("Yoshi")
控制台输出:
DECORATOR None APPLIED
Hello Yoshi :)
MYDECO
我的项目中也有类似的设置,我无法理解为什么decorator函数deco()不知道全局变量deco_name的更新值(它打印decorator None APPLIED而不是decorator MYDECO APPLIED)。 修饰函数hello()确实知道更新值,正如上次print语句生成的MYDECO所示。 我需要一些方法在运行时设置一个全局变量,并将其传递给decorator,如果有人能a)向我解释为什么我的方法是错误的,b)给我一个修复/替代解决方案,我会很高兴
提前谢谢
主要问题是在创建类时创建装饰器。因此,在设置变量之前会调用外部装饰程序。您可以将所有这些放在包装器函数中,这样只有在调用
hello()
时才会调用它我不确定为什么在这里使用全局变量。您可以访问包装器函数中的实例变量,这对我来说更有意义。下面是一个设置和访问全局变量和实例变量的示例。也许这会给事情指明一个有用的方向:
印刷品
我很确定这里发生的事情是在对象初始化之前解释deco_名称。当你在一个类中注释一个函数时,几乎所有的事情都是这样的:一旦类本身被解释,装饰器就“准备好了”,这意味着@deco在你指定g时是不可更改的
最好的选择可能是将hello打包到一个不同的函数中,该函数实现了decorator的功能:
这还将用类属性替换全局装饰名称
相关问题 更多 >
编程相关推荐