如何调试未调用的__del __()
我使用__del__()
编写了一个警告日志,以防对象在错误的内部状态下被删除(请不要愤怒)。如何调试未调用的__del __()
我试图测试它,但虽然我在测试中使用del my_object
,但__del__()
似乎没有被调用。
__del__()
's reference对可能发生这种情况的3种情况发出警告,但并未提供如何调试它们的线索。
那么...我该如何去调试呢?
回调的输出。如果__del__
当你直接调用del myObject
不会被调用,则有至少一个其他优秀对myObject的引用。我猜你已经把它塞入列表或字典或集合(或者也许是一个记忆缓存),其中不是复制对象,只是保存对原始的第二个引用。即使是这样做的:
myObject = MyObjectClassWith__del__()
del myObject
不一定叫__del__
,如果类的__init__
方法或__new__
方法保存新的实例为若干类级缓存或结构。底线:通过检查您的代码或使用其他答案中发布的weakref或gc方法检查其他参考。
那么,你可以试着强迫gc to collect这个对象。如果你想找出哪些对象仍然有对你的对象的引用,并可能会阻止他们被垃圾收集,玩gc.get_referrers
和gc.get_referents
。
'gc'模块不会收集具有'__del__'方法的对象,因此调用'gc.collect()'不会收集它。它可能只是将对象置于'gc.garbage'中。 –
@agf - 是的,怎么样? (当然,除了经历很多代码) – Jonathan
你应该给我们一些代码。 –
很简单。不要使用'__del__',使用上下文管理器。 –