是否有任何障碍阻止weakref
做任何__del__
做的事情,但有更强有力的保证(例如,finalize
保证在解释器退出之前进行调用,并且调用顺序定义良好等)?
似乎在遥远的过去,weakref
最终会导致语言中的__del__
被删除。
是什么阻止了这一切的发生?
似乎有it was thought,而且我所知道的所有这些似乎都至少对__del__
回调或weakref
起作用(通常更好)。
更新:
随着few use cases for weakref.finalize
显著地改善了__del__
的行为,以及@gz和@user2357112提到的对weakref
的关注,我想知道该语言通常是朝着使__del__
更可靠,还是朝着使用weakref
而不是__del__
或两者兼而有之的方向发展。
最佳答案
还有一个比较务实的原因。几个显著的改善,包括__del__
,是new in Python 3.4。因此,用更好的weakrefs替换weakref
会错过用py3k进行语言破坏性更改的窗口。
我认为大多数的使用都可以被基本的weakref功能所取代,但是我被Richard Oudkerk在“建议和实施的地方”中的观察所震惊。
[weakref callbacks]是低级别的,要想正确使用它们,需要有点挠头。你必须找到一个地方来存放武器,直到参考者死后,并且不意外地保持参考者的生命。然后必须确保回调释放weakref(而不留下任何剩余的ref循环)。
当它是一个选项时,使用finalize
方法的麻烦要少得多。
不管怎样,在考虑Python4时,也许应该再次提出这个问题?;)