如何调试未被调用的__del__()函数

3
我使用__del__()来写一个警告日志,以防对象在错误的内部状态下被删除(请不要对此发怒)。
我尝试进行测试,但尽管我在测试中使用了del my_object__del__()似乎没有被调用。 __del__()的参考文档警告有三种可能会发生这种情况,但没有提供调试的线索。
那么...我该如何进行调试?

@agf - 是的,怎么做呢?(当然,除了大量查看代码之外) - Jonathan Livni
你应该给我们一些代码。 - Dhaivat Pandya
5
简单来说,不要使用 __del__,而应该使用上下文管理器。 - Cat Plus Plus
3个回答

4
您可以将可疑对象之间的所有引用更改为弱引用,并观察您提供给weakref.ref的回调输出。

4
如果您直接调用del myObject__del__没有被调用,那么说明myObject至少还有一个未释放的引用。我猜您可能已经将其放入列表、字典或集合(或者是记忆缓存)中,并且没有复制对象,只是保存了对原始对象的第二个引用。即使执行以下操作:
myObject = MyObjectClassWith__del__()
del myObject

如果类的__init__方法或__new__方法将新实例保存到某个类级缓存或结构中,则可能不一定调用__del__

总之,通过检查代码或使用其他答案中发布的weakref或gc方法来检查其他引用。


3

如果您想强制进行垃圾回收,可以尝试使用gc.collect。如果您想找出仍然引用您的对象并可能阻止其被垃圾回收的对象,请使用gc.get_referrersgc.get_referents进行测试。


1
gc 模块不会回收具有 __del__ 方法的对象,因此调用 gc.collect() 不会回收它。它可能只是将对象放入 gc.garbage 中。 - Thomas Wouters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接