当Python解释器关闭时,我有点搞不清楚对象发生了什么。 如果我写一点这样的代码
class MyClass(object):
def __del__(self):
print "I'm going away"
o = MyClass()
然后运行它,我会得到这个
I'm going away
我的理解是,当解释器关闭时,它将删除对已创建对象的所有引用,如果指定这些对象,它们将运行__del__()
(因为它们的ref count是0)。你知道吗
我的困惑是因为:
__del__()
的文档,我看到了这个It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
,它变得有点复杂了,他们是说它不能保证运行是因为一些周期依赖性,还是说它不能保证?谁决定的?你知道吗所以我的问题是:
__del__
guaranteed
我不明白第一个问题的意义,但是对于cpython2.7.8,
__del__
被PyInstanceObject.instance_dealloc
调用,它注册为tp_dealloc
,当Py_DECREF
被调用并且引用计数达到零时调用。所以,让我们假设解释器调用它,而不是Python代码。如果你问这个问题的目的是希望你能改变它的呼叫方式或时间,我认为这是不可能的。你知道吗至于为什么不能保证,要做到这一点,您必须遍历所有模块,在退出之前删除它们的变量,但是如果
__del__
方法依赖于任何全局变量,就没有简单的方法来保证它们执行的安全顺序。我不是说这是不可能的,就像参考循环,我是说它很复杂。你知道吗我想这是在某个时候讨论过的,但社区或BDFL认为这不值得这么麻烦。我相信几年前我看到过一些关于这个的讨论,但现在找不到了。从一开始就不鼓励使用
__del__
方法,如果您需要保证调用某种析构函数方法,那么最好使用上下文管理器。你知道吗相关问题 更多 >
编程相关推荐