【问题标题】:How to debug uncalled __del__()如何调试未调用的 __del__()
【发布时间】:2011-11-06 14:21:20
【问题描述】:

我使用__del__() 写一个警告日志,以防对象在错误的内部状态下被删除(请不要生气)。

我尝试对其进行测试,但尽管我在测试中使用了del my_object,但似乎没有调用__del__()

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

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

【问题讨论】:

  • @agf - 是的,怎么样? (当然除了要经历很多代码)
  • 你应该给我们一些代码。
  • 很简单。不要使用__del__,使用上下文管理器。

标签: python destructor del


【解决方案1】:

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

myObject = MyObjectClassWith__del__()
del myObject

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • gc 模块不会收集具有__del__ 方法的对象,因此调用gc.collect() 不会收集它。它可能所做的只是将对象放在gc.garbage
      猜你喜欢
      • 2017-04-08
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2016-01-03
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多