循环引用

问题描述:

对象的处置

我的设计如下:循环引用

  • __main__引用a
  • a引用b
  • b引用a
  • a被创建,然后从__main__
  • 设置的

因此ab有循环引用。不过,在del a我宁愿处置ab

我在许多地方看到建议使用上下文管理器,特别是with而不是__del__()。然而,我所看到的with的所有例子在本地范围内(例如某种方法)开始和结束

这可以用with优雅地执行吗?
有什么选择?

我建议之一:

  • 使用weakref - 不__del__但在 - 当循环引用涉及
  • 或者只在手动顺序处置的东西,你需要的是有时适用明确dispose方法呼叫在正确的时间(s)

在一般情况下,当你知道你有循环引用,relyi自动处理__del__不是一个好主意。它很脆弱 - 即使您在某些情况下设法使其发挥作用,依赖关系的小改动可能会再次破坏它。

垃圾收集器应该处理这个问题。

有什么选择?

什么都不做。直到您创建数百万个这样的循环引用 - 并且可以证明这(并且仅此)正在破坏您的程序 - 实际上并不重要。