栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么不能保证在解释器退出时调用析构函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么不能保证在解释器退出时调用析构函数?

我不相信以前的答案在这里。

首先请注意,给出的示例 不会 阻止

__del__
在退出过程中调用方法。实际上,当前的CPython
调用
__del__
给定的方法,在Python 2.7中两次,在Python 3.4中一次。因此,这不能成为显示为什么不做出保证的“杀手example”。

我认为文档中的声明并非出于设计原则,即调用析构函数将是不好的。尤其重要的是,似乎在CPython
3.4及更高版本中,它们总是像您期望的那样被调用,并且此警告似乎没有意义。

相反,我认为该语句只是反映了一个事实,即CPython实现有时并未在退出时调用所有析构函数(大概是出于易于实现的原因)。

情况似乎是CPython 3.4和3.5确实总是在解释器出口调用所有析构函数。

相比之下,CPython
2.7并不总是这样做。当然,

__del__
在具有循环引用的对象上通常不会调用方法,因为如果这些对象具有
__del__
方法,则无法将其删除。垃圾收集器不会收集它们。尽管在解释器退出时对象确实消失了(当然),它们没有被终结,所以
__del__
从不调用它们的方法。在执行PEP
442之后,在Python 3.4中不再是这样。

但是,似乎Python 2.7也不会最终确定具有循环引用的对象,即使它们没有析构函数,即使它们仅在解释器退出期间变得不可访问也是如此。

大概这种行为是非常特殊的,很难解释,就像文档一样,最好仅通过通用免责声明来表达。

这是一个例子:

class Foo(object):    def __init__(self):        print("Foo init running")    def __del__(self):        print("Destructor Foo")class Bar(object):    def __init__(self):        print("Bar1 init running")        self.bar = self        self.foo = Foo()b = Bar()# del b

随着

del b
注释掉,在析构函数
Foo
是不是在Python 2.7叫虽然它是在Python 3.4。

随着

del b
加入,然后调用析构函数(在解释退出)在这两种情况下。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/617716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号