【发布时间】:2017-10-01 05:12:06
【问题描述】:
是否有任何障碍阻止weakref 做__del__ 所做的所有事情,但有更强有力的保证(例如,finalize 保证调用将在解释器退出之前进行,并且调用顺序很好-定义等)?
似乎在遥远的过去 it was thought weakref 最终会导致 __del__ 从语言中删除。
是什么阻止了这种情况的发生?
似乎有few use cases for __del__,而且我所知道的所有这些似乎至少与weakref 回调或weakref.finalize 一样好(通常更好)。
更新:
随着PEP 442 显着改善__del__ 的行为,以及@gz 和@user2357112 提到的对weakref 的担忧,我想知道该语言是否普遍朝着使__del__ 更可靠的方向发展,或者倾向于使用weakref 而不是__del__,或两者兼而有之。
【问题讨论】:
-
“是什么阻止了这种情况的发生?” 这是一个很少可能能够回答的问题。我建议您也将其发布到
python-list,希望能引起一些核心开发人员的注意。 -
Python 的weakref 支持非常糟糕,因此您不能将weakrefs 用于许多您想要weakref 的对象类型。这对于您自己编写的类型通常无关紧要,但如果您的类型类似于
tuple子类,则不能对其进行弱引用。 -
另外,weakref 回调无法访问引用对象,因此需要更仔细的设计。
-
@user2357112 例如,根据文档,weakrefs 不能用于生成器。这是否意味着目前绝对没有办法用weakrefs替换生成器
__del__?或者有一些解决方法(例如创建一个单独的对象,该对象仅与将用作weakref.finalize触发器的生成器链接)?
标签: python python-3.x garbage-collection destructor weak-references