处置带有循环引用的对象

Jon*_*han 2 python with-statement circular-reference contextmanager

我的设计如下:

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

因此,ab有循环参考.然而在del a我宁愿都ab处置.

我在很多地方看到使用Context Manager的建议,特别是with语句而不是__del__().但是我with在局部范围内看到的开始和结束的所有例子(例如某种方法)

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

Eli*_*sky 5

我建议:

  • 使用weakref - 有时在涉及循环引用时适用
  • 或者......只需按照你需要的顺序手动处理东西 - 不是以在正确的时间调用__del__的显式dispose方法处理

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