循环引用
问题描述:
对象的处置
我的设计如下:循环引用
-
__main__
引用a
-
a
引用b
-
b
引用a
-
a
被创建,然后从__main__
设置的
因此a
和b
有循环引用。不过,在del a
我宁愿处置a
和b
。
我在许多地方看到建议使用上下文管理器,特别是with
而不是__del__()
。然而,我所看到的with
的所有例子在本地范围内(例如某种方法)开始和结束
这可以用with
优雅地执行吗?
有什么选择?
答
我建议之一:
- 使用weakref - 不
__del__
但在 - 当循环引用涉及 - 或者只在手动顺序处置的东西,你需要的是有时适用明确
dispose
方法你呼叫在正确的时间(s)
在一般情况下,当你知道你有循环引用,relyi自动处理__del__
不是一个好主意。它很脆弱 - 即使您在某些情况下设法使其发挥作用,依赖关系的小改动可能会再次破坏它。
答
垃圾收集器应该处理这个问题。
答
有什么选择?
什么都不做。直到您创建数百万个这样的循环引用 - 并且可以证明这(并且仅此)正在破坏您的程序 - 实际上并不重要。