如何调试uncalled __del __()

时间:2011-08-30 07:51:30

标签: python destructor del

我使用__del__()编写警告日志,以防对象在内部状态错误时被删除(请不要愤怒)。

我尝试测试它但是虽然我在测试中使用了del my_object,但__del__()似乎没有被调用。

__del__()'s reference警告可能发生这种情况的3种情况,但没有提供如何调试它们的线索。

那么......我该如何调试呢?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

如果直接调用__del__时未调用del myObject,则至少还有一个对myObject的未完成引用。我猜你已把它塞进一个列表或字典或设置(或者可能是一个memoizing缓存),它复制对象,只保存对原始的第二个引用。甚至做:

myObject = MyObjectClassWith__del__()
del myObject
如果类的__del__方法或__init__方法将新实例保存到某个类级别的缓存或结构中,

可能不一定会调用__new__

底线:通过检查代码或使用其他答案中发布的weakref或gc方法检查其他引用。

答案 2 :(得分:3)

好吧,你可以尝试强制gc to collect对象。如果您想知道哪些对象仍然引用了您的对象,并且可能阻止它们被垃圾收集,请使用gc.get_referrersgc.get_referents