我使用__del__()
编写警告日志,以防对象在内部状态错误时被删除(请不要愤怒)。
我尝试测试它但是虽然我在测试中使用了del my_object
,但__del__()
似乎没有被调用。
__del__()
's reference警告可能发生这种情况的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_referrers
和gc.get_referents
。