【发布时间】:2020-05-14 07:31:06
【问题描述】:
Python 类的类变量似乎不会在包之间持续存在。
我有一个“HookRegistry”类,它应该动态记录使用@regiser_hook 方法注释的函数。 IT 这样做很成功,但是当我再次查找已注册的挂钩列表时,保存它们的列表变量似乎已重新初始化。
class HookRegistry(object):
hooks = []
def register_hook(f):
HookRegistry.hooks.append(f)
print("Registrering hook. There are now {} hooks registered.".format(len(HookRegistry.hooks)))
def wrap(*args, **kwargs):
f(*args, **kwargs)
return wrap
def execute_hooks(*args, **kwargs):
for f in HookRegistry.hooks:
f(*args, **kwargs)
完整的源代码可以在https://github.com/conallprendergast/python_hook_registry_example/tree/not_working找到
我在 Arch linux 上运行 python 3.8
【问题讨论】:
-
你如何确定它已经被重新初始化了?在您的示例代码中,实际的钩子执行将始终以
KeyError终止(因为它试图从kwargs读取未传递的密钥)。另请注意:您的两个函数都应该用@staticmethod装饰(或者应该删除无意义的类包装,因为它们实际上是全局函数)以明确它们根本不使用实例数据。 -
你不需要包装器;只需返回
f。register_hook的重点不是为装饰函数添加功能,而只是更新列表。 -
@chepner:特别是考虑到他们忽略了
return来自f的值,因此包装会破坏任何具有非None返回值的函数。 -
@chepner:我指的是他们的实际示例代码,其中
f函数都接受**kwargs,但随后假设kwargs包含密钥"day"。 -
啊,这不是问题所在。我忽略了这一点。
标签: python python-3.x python-decorators