2011-08-30 24 views
3

我使用__del__()编写了一个警告日志,以防对象在错误的内部状态下被删除(请不要愤怒)。如何调试未调用的__del __()

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

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

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

+0

@agf - 是的,怎么样? (当然,除了经历很多代码) – Jonathan

+0

你应该给我们一些代码。 –

+5

很简单。不要使用'__del__',使用上下文管理器。 –

回答

4

回调的输出。如果__del__当你直接调用del myObject不会被调用,则有至少一个其他优秀对myObject的引用。我猜你已经把它塞入列表或字典或集合(或者也许是一个记忆缓存),其中不是复制对象,只是保存对原始的第二个引用。即使是这样做的:

myObject = MyObjectClassWith__del__() 
del myObject 

不一定叫__del__,如果类的__init__方法或__new__方法保存新的实例为若干类级缓存或结构。底线:通过检查您的代码或使用其他答案中发布的weakref或gc方法检查其他参考。

3

那么,你可以试着强迫gc to collect这个对象。如果你想找出哪些对象仍然有对你的对象的引用,并可能会阻止他们被垃圾收集,玩gc.get_referrersgc.get_referents

+1

'gc'模块不会收集具有'__del__'方法的对象,因此调用'gc.collect()'不会收集它。它可能只是将对象置于'gc.garbage'中。 –

4

您可以更改嫌疑对象之间的所有引用weakref,看你提供weakref.ref