经过多次检查,我确实发现有关该主题的信息不一致。
在某些情况下,我确实发现__init__ and __del__
是 python 中的构造函数和析构函数。这似乎适用于__init__
,因为我看到它在创建类时被调用;但__del__
当程序结束时,永远不会被调用。
在其他情况下,我确实发现__del__
很糟糕,您必须手动明确地释放所有内容。
现在的问题是:哪个是哪个?因为使用 unittest.TestCase 类,当我调用__del__
它永远不会被调用。遗憾的是,我无法使用拆解,因为我需要在测试运行之前启动一个进程,并在完成测试后结束它
很少有这样的帖子,您会在其中看到这种行为,即例如__del__
没有接到电话,只是进行了讨论。举几个我觉得有趣的来源,SO 和__del__
文档:
什么是 __del__ 方法,如何调用它? https://stackoverflow.com/questions/1481488/what-is-the-del-method-how-to-call-it
我不明白这个 python __del__ 行为 https://stackoverflow.com/questions/6104535/i-dont-understand-this-python-del-behaviour
https://docs.python.org/3/reference/datamodel.html#object。del https://docs.python.org/3/reference/datamodel.html#object.__del__
我发现文档中的部分特别有启发性:
Note: del x
不直接调用x.__del__()
— 前者将 x 的引用计数减一,后者仅在 x 的引用计数达到零时调用。一些可能阻止对象的引用计数变为零的常见情况包括: 对象之间的循环引用(例如,双向链表或具有父子指针的树数据结构);对捕获异常的函数的堆栈帧上的对象的引用(存储在 sys.exc_info() 中的回溯)2 https://stackoverflow.com/questions/6104535/i-dont-understand-this-python-del-behaviour保持堆栈帧处于活动状态);或对在交互模式下引发未处理异常的堆栈帧上的对象的引用(存储在 sys.last_traceback 中的回溯使堆栈帧保持活动状态)。第一种情况只能通过明确打破循环来补救;第二个可以通过在不再有用时释放对回溯对象的引用来解决,第三个可以通过在 sys.last_traceback 中存储 None 来解决。当启用循环垃圾收集器(默认情况下处于打开状态)时,会检测并清除垃圾循环引用。有关此主题的更多信息,请参阅 gc 模块的文档。
所以很明显有这样的情况__del__
可能不会被调用,因为对象的引用计数尚未达到零,并且在注释中列出了可能发生这种情况的几种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)