处理带有循环引用的对象

发布于 2024-12-02 02:29:48 字数 527 浏览 1 评论 0原文

我的设计如下:

  • __main__ 引用 a
  • a 引用 b
  • b 引用 < code>a
  • a 被创建,然后从 __main__ 中释放,

因此 ab 具有循环参考。然而,在 del a 后,我更希望将 ab 都处理掉。

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

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

My design is as follows:

  • __main__ references a
  • a references b
  • b references a
  • a is created and then disposed of from __main__

Thus a and b have circular references. However upon del a I would prefer both a and b disposed of.

I see in many places advice to use Context Managers, and specifically the with statement instead of __del__(). However all the examples I see of with start and end in local scope (e.g. of a certain method)

Can this be elegantly performed with with?
What is the alternative?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

缺⑴份安定 2024-12-09 02:29:48

我建议:

  • 使用 weakref - 有时在涉及循环引用时适用
  • ,或者......只是手动处理按照您需要的顺序排列内容 - 不是在 __del__ 中,而是在您在正确的时间调用的显式 dispose 方法中。

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

I recommend either:

  • Using weakref - which is sometimes applicable when circular references are involved
  • or ... just manually disposing of stuff in the order you need - not in __del__ but in an explicit dispose method you call at the right time(s)

In general, when you know you have circular references, relying on automatic __del__ disposal is not a good idea. It's brittle - even if you manage to make it work in some case, small changes in dependencies can break it again.

天涯沦落人 2024-12-09 02:29:48

有什么替代方案吗?

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

What is the alternative?

Do nothing. Until you create millions of circular references like this -- and can prove that this (and only this) is breaking your program -- it doesn't actually matter.

花桑 2024-12-09 02:29:48

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

Garbage collector is supposed to handle this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文