【问题标题】:Disposing of objects with circular references使用循环引用处理对象
【发布时间】:2011-08-30 09:24:23
【问题描述】:

我的设计如下:

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

因此ab 具有循环引用。但是,在 del a 上,我更愿意同时处理 ab

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

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

【问题讨论】:

    标签: python with-statement circular-reference contextmanager


    【解决方案1】:

    我建议:

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

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

    【讨论】:

      【解决方案2】:

      有什么选择?

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-19
          • 2011-04-12
          • 1970-01-01
          • 2017-08-04
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多