3

__del__()用来写一个警告日志,以防对象在错误的内部状态下被删除(请不要对此感到愤怒)。

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

__del__()的参考警告了 3 种可能发生这种情况的情况,但没有给出如何调试它们的线索。

所以...我该如何调试它?

4

3 回答 3

4

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

于 2011-08-30T09:31:07.483 回答
4

如果__del__在您直接调用时没有被调用del myObject,那么至少还有一个对 myObject 的未完成引用。我猜你已经把它塞进了一个列表或字典或集合(或者可能是一个记忆缓存)中,它不会复制对象,只是保存对原始对象的第二个引用。甚至在做:

myObject = MyObjectClassWith__del__()
del myObject

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

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

于 2011-08-30T12:53:45.967 回答
3

好吧,您可以尝试强制gc 收集对象。如果您想找出哪些对象仍然具有对您的对象的引用并且可能阻止它们被垃圾收集,请使用gc.get_referrersand gc.get_referents

于 2011-08-30T08:00:03.987 回答