2 python
经过多次检查后,我确实发现了有关该主题的不一致信息.
在某些情况下,我确实发现__init__ and __del__python等同于构造函数和析构函数.这似乎是真的__init__,因为我看到它在创建类时被调用; 但__del__永远不会被调用,当程序结束.
在其他情况下,我确实发现这__del__很糟糕,你必须手动解除分配所有内容.
现在,问题是:哪个是哪个?因为使用unittest.TestCase类,当我调用__del__它时永远不会被调用.可悲的是我无法使用拆卸,因为我需要在测试运行之前启动一个进程,并在完成测试后结束它
很少有SO帖子,你看到的这种行为,即例如__del__没有被调用的行为,是一种讨论.举几个我觉得有趣的来源,包括SO和__del__文档:
什么是__del__方法,如何调用它?
我不明白这个python __del__行为
https://docs.python.org/3/reference/datamodel.html#object.德尔
我发现特别照亮了文档中的部分:
注意:
del x不直接调用x.__del__()- 前者将x的引用计数递减1,后者仅在x的引用计数达到零时调用.可能阻止对象的引用计数变为零的一些常见情况包括:对象之间的循环引用(例如,双向链表或具有父指针和子指针的树数据结构); 对捕获异常的函数的堆栈帧上的对象的引用(存储在sys.exc_info()2中的回溯使堆栈帧保持活动状态); 或者对交互模式中引发未处理异常的堆栈帧上的对象的引用(存储在sys.last_traceback中的回溯使堆栈帧保持活动状态).第一种情况只能通过明确打破周期来弥补; 第二个可以通过释放对traceback对象不再有用的引用来解决,第三个可以通过在sys.last_traceback中存储None来解决.启用循环垃圾收集器时会检测并清除循环引用(默认情况下处于打开状态).有关此主题的更多信息,请参阅gc模块的文档.
因此,有明显的情况 __del__可能无法调用,因为对象的引用计数未达到零,并且在注释中列出了可能发生这种情况的少数情况.