当Python解释器关闭时,对于对象发生的事情我有点困惑。 如果我写一些像这样的代码
class MyClass(object):
def __del__(self):
print "I'm going away"
o = MyClass()
然后运行它,我会得到这个
I'm going away
我的理解是,当解释器关闭时,它将删除对创建对象的所有引用,如果指定,这些对象将运行__del__()
(因为它们的引用计数为0)。
我的困惑是因为:
__del__()
的文档我看到了It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
而且它变得有点复杂了,他们是说由于某些周期依赖性而无法保证它不能保证运行吗?是谁决定的?所以我的问题是:
__del__
guaranteed
被调用答案 0 :(得分:2)
我没有看到第一个问题的意义,但对于CPython 2.7.8,__del__
由PyInstanceObject.instance_dealloc
调用,tp_dealloc
被注册为Py_DECREF
,被称为当调用__del__
并且引用计数达到零时。所以,我们只是说解释器调用它,而不是Python代码。如果你问这个问题,希望你可以改变调用的方式和时间,我认为这是不可能的。
至于为什么不能保证,要做到这一点,你必须在退出之前通过所有模块删除它们的变量,但如果__del__
方法依赖于任何全局变量,那么没有简单的方法来保证他们被执行的安全命令。我不是说这是不可能的,就像参考周期一样,我说它很复杂。
我想这在某个时候已经讨论过了,但社区或BDFL决定不值得麻烦。我相信我在几年前看到了一些讨论,但我现在找不到它。首先从不鼓励使用{{1}}方法,如果需要保证调用一些析构函数方法,那么最好使用上下文管理器。