Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.8类变量不是持久的_Python_Python 3.x_Python Decorators - Fatal编程技术网

Python 3.8类变量不是持久的

Python 3.8类变量不是持久的,python,python-3.x,python-decorators,Python,Python 3.x,Python Decorators,Python类的类变量似乎不会在包之间持久化 我有一个类“HookRegistry”,它应该动态记录用@regiser\u hook方法注释的函数。它成功地做到了这一点,但当我再次查找已注册的钩子列表时,保存它们的list变量似乎被重新初始化 类钩子注册表(对象): 挂钩=[] def寄存器挂钩(f): HookRegistry.hooks.append(f) 打印(“注册钩子。现在已注册了{}个钩子。”.format(len(HookRegistry.hooks))) def包裹(*args,

Python类的类变量似乎不会在包之间持久化

我有一个类“HookRegistry”,它应该动态记录用@regiser\u hook方法注释的函数。它成功地做到了这一点,但当我再次查找已注册的钩子列表时,保存它们的list变量似乎被重新初始化

类钩子注册表(对象):
挂钩=[]
def寄存器挂钩(f):
HookRegistry.hooks.append(f)
打印(“注册钩子。现在已注册了{}个钩子。”.format(len(HookRegistry.hooks)))
def包裹(*args,**kwargs):
f(*args,**kwargs)
回程包装
def执行钩(*args,**kwargs):
对于HookRegistry.hooks中的f:
f(*args,**kwargs)
完整的源代码可以在


我正在arch linux上运行Python3.8,这不起作用,因为模块
do\u something*
没有执行。(我们可以很容易地检查这一点:只需将不正确的代码添加到
do\u something.py

from .do_something import *
from .do_something_else import *
这是可以修复的,请将此代码添加到
hooks/\uuuu init\uuuuuuuuuu.py

from .do_something import *
from .do_something_else import *

通过更改“hook”do_something*文件中的代码,可以解决此问题

from hookregistry import HookRegistry
需要改成

from .hookregistry import HookRegistry

如何确定它已被重新初始化?在您的示例代码中,实际的钩子执行将始终伴随一个
KeyError
(因为它试图从
kwargs
读取一个未传递的键)。另外请注意:两个函数都应该用
@staticmethod
修饰(或者应该删除无意义的类包装,因为它们实际上是全局函数)为了明确起见,它们根本不使用实例数据。@chepner:你不需要包装器;只需返回
f
register\u hook
的目的不是向修饰过的函数添加功能,而只是更新一个列表。@chepner:特别是考虑到它们忽略了
返回
f
中的值,因此包装将是b用非
None
返回值重新读取任何函数。@chepner:我指的是它们的实际示例代码,
f
函数都接受
**kwargs
,但随后假设
kwargs
包含键
“day”
。啊,这不是问题所在。我忽略了这一点。这些模块是从init.py all声明中导入的。向do_添加语法错误的代码giles实际上会破坏代码