返回介绍

对象析构函数:__del__

发布于 2024-01-29 22:24:15 字数 986 浏览 0 评论 0 收藏 0

每当实例产生时,就会调用__init__构造函数。每当实例空间被收回时(在垃圾收集时),它的对立面__del__,也就是析构函数(destructor method),就会自动执行。

在这里,当brian赋值为字符串时,我们会失去Life实例的最后一个引用。因此会触发其析构函数。这样行得通,可用于完成一些清理行为(例如,中断服务器的连接)。然而,基于某些原因,在Python中,析构函数不像其他OOP语言那么常用。

原因之一就是,因为Python在实例收回时,会自动收回该实例所拥有的所有空间,对于空间管理来说,是不需要析构函数的[1]。原因之二是无法轻易地预测实例何时收回,通常最好是在有意调用的方法中(或者try/finally语句,本书下一部分会说明)编写代码去终止活动。在某种情况下,系统表中可能还在引用该对象,使析构函数无法执行。

注意:实际上,即便因为某些很细微的原因,__del__可能会很难使用。例如,直接向sys.stderr(标准错误流)打印一条警告消息,而不是触发一个异常事件,这也会从中引发异常,因为垃圾收集器在不可预料的环境下运行。此外,当我们期待垃圾收集的时候,对象间的循环引用可能会阻止其发生。一个可选的循环检测器,是默认可用的,最终可以自动检测这样的对象,但是,只有在它们没有__del__方法的时候才可用。由于这相对比较难理解,所以我们再次略过进一步的细节。参见Python的标准手册对__del__和gc垃圾收集模块的介绍,以获取更多信息。

[1]在当前C实现的Python中,不需要在析构函数中关闭由实例打开的文件,因为那些文件在被收回时也会自动关闭。然而,就像第9章介绍的,最好明确地调用文件的关闭方法,因为在收回时自动关闭是最终的表现,而不是语言本身的特性(这种行为在Jython底下也许就有所不同)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文