处置带有循环引用的对象

时间:2011-08-30 09:24:24

标签: python with-statement circular-reference contextmanager

我的设计如下:

  • __main__引用a
  • a引用b
  • b引用a
  • a已创建,然后从__main__
  • 处理

因此ab具有循环引用。但是,del a我希望处理ab

我在许多地方看到使用上下文管理器的建议,特别是with语句而不是__del__()。但是,我在with看到的所有示例都以局部范围(例如某种方法)开始和结束

这可以用with优雅地执行吗? 有什么替代方案?

3 个答案:

答案 0 :(得分:5)

我建议:

  • 使用weakref - 有时在涉及循环引用时适用
  • 或...只需按照您需要的顺序手动处理内容 - 不是在__del__中,而是在明确的dispose方法在适当的时间调用(s )

一般情况下,当您知道自己有循环引用时,依赖自动__del__处理并不是一个好主意。它很脆弱 - 即使你设法让它在某些情况下工作,依赖关系的微小变化也会再次破坏它。

答案 1 :(得分:2)

  

有什么替代方案?

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

答案 2 :(得分:0)

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