This question already has answers here:
What is the __del__ method, How to call it?
(5个答案)
5个月前关闭。
经过无数次的检查,我确实发现关于这个话题的信息不一致。
在某些情况下,我确实发现
在其他情况下,我确实发现
现在,问题是:哪个是哪个?因为使用unittest.TestCase类,当我调用
(5个答案)
5个月前关闭。
经过无数次的检查,我确实发现关于这个话题的信息不一致。
在某些情况下,我确实发现
__init__ and __del__
是相当于构造函数和析构函数的python。对于__init__
,这似乎是正确的,因为我看到它在创建类时被调用;但是当程序结束时,__del__
永远不会被调用。在其他情况下,我确实发现
__del__
是不好的,您必须显式地手动释放所有内容。现在,问题是:哪个是哪个?因为使用unittest.TestCase类,当我调用
__del__
时,它永远不会被调用。很遗憾,我不能使用拆卸,因为我需要在测试运行之前启动一个进程,并在完成测试后结束它 最佳答案
很少有这样的帖子会讨论这种行为,例如__del__
没有被调用。举几个我觉得有趣的来源,包括SO和__del__
文档:
What is the __del__ method, How to call it?
I don't understand this python __del__ behaviour
https://docs.python.org/3/reference/datamodel.html#object.del
我发现文件中的这一部分特别有启发性:
注意:del x
不直接调用x.__del__()
-前者将x的引用计数递减一,后者仅在x的引用计数达到零时调用。一些可能阻止对象的引用计数变为零的常见情况包括:对象之间的循环引用(例如,具有父指针和子指针的双链接列表或树数据结构);对捕捉到异常的函数堆栈帧上的对象的引用(存储在sys.exc_info()2中的跟踪保持堆栈帧活动);或对在交互模式下引发未处理异常的堆栈帧上的对象的引用(存储在sys.last_traceback中的跟踪保持堆栈帧活动)。第一种情况只能通过显式中断循环来解决;第二种情况可以通过在回溯对象不再有用时释放对它的引用来解决,第三种情况可以通过在sys.last_traceback中存储None来解决。启用循环垃圾收集器(默认为启用)时,将检测并清除作为垃圾的循环引用。有关此主题的详细信息,请参阅gc模块的文档。
因此,显然有一些情况下,由于对象的引用计数未达到零,因此可能无法调用__del__
,在注释中,列出了可能发生这种情况的少数情况。