当前位置: 首页 > 面试题库 >

__del__退出行为

须捷
2023-03-14
问题内容

我有一些test.py文件:

class A:
    def __init__(self):
        print("A init")

    def __del__(self):
        print("A del")

a = A()

当我运行10次(python3 test.py)时,它总是产生下一个输出:

A init
A del

但是,如果我sys.exit在脚本末尾添加调用:

import sys

class A:
    def __init__(self):
        print("A init")

    def __del__(self):
        print("A del")

a = A()

sys.exit(-1)

在10个案例中有5个(随机)

A init

在后半部分情况下:

A init
A del

我在Windows 7 x64上使用Python3.4.3 [MSC v.1600
32位]。那么为什么__del__方法不是每次都调用?我是否需要使用其他退出方法来传递脚本的返回代码,并确保所有析构函数都已执行?还有一个相关的问题:是否可以在从OS接收SIGTERM或SIGKILL时执行析构函数?


问题答案:

从文档中:

不能保证__del__()在解释器退出时为仍然存在的对象调用方法。

如果要确保a.__del__调用了该方法,则必须显式删除该实例:

a = A()
del a   # Assuming this is the final reference to the object


 类似资料:
  • 我们知道, Python 通过调用 __init__() 方法构造当前类的实例化对象,而本节要学的 __del__() 方法,功能正好和 __init__() 相反,其用来销毁实例化对象。 事实上在编写程序时,如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放其占用的内存空间(整个过程称为 垃圾回收(简称GC) )。 大多数情况下,Python 开发者不需要手动进行垃圾回收,

  • 问题内容: 有人可以解释为什么以下代码会如此行为: 输出(请注意,永远不会调用d2的析构函数)是(python 2.7) 有没有一种方法可以“修复”代码,以便在不删除添加的方法的情况下调用析构函数?我的意思是,放置d2.func = None的最佳位置将在析构函数中! 谢谢 [edit]基于前几个答案,我想澄清一下,我并不是在问using的优点(或不足之处)。我试图创建最短的函数来证明我认为是非直

  • 问题内容: 我有一个python类对象,我想分配一个类变量的值 该执行结果是正确的,但是有一条错误消息指出: 有人可以告诉我我做错了什么吗? 问题答案: 您的方法假定该类在被调用时仍然存在。 这个假设是不正确的。当您的Python程序退出时,已被清除,现在设置为。 测试是否仍然首先存在对该类的全局引用: 或用于获取本地参考: 但是请注意,这意味着更改的语义是子类的(每个子类都有一个属性,而不是只有

  • 在某些项目上运行< code>flutter run时,我收到了以下错误,但是在其他项目上运行正常: 这只是颤振演示项目,我没有做任何更改。