python - 是否在未完成初始化的对象上调用了 del?

标签 python python-3.x

如果对象的 __init__ 没有完成(例如抛出异常),是否会调用 __del__

最佳答案

class test():
    def __init__(self):
        raise

    def __del__(self):
        print "__del__ called"

try:
    test()
except:
    pass

是的。

说明: __del__ 在对象的最后一个引用被删除时被调用。但是如果你没有捕捉到异常,__del__ 将不会被调用,因为 python 仍然在堆栈中保留对对象的引用,并且一直保留到程序退出以打印回溯。如果您捕获并处理异常,则一旦与异常相关的所有信息从堆栈中丢弃,该对象就会被删除。

当然,如果程序即将退出,__del__ 并不能保证成功运行,除非小心谨慎,在某些情况下甚至不能——参见 __del__ warning .

附录: Cédrik Julien 在他的回答(现已修改)中说:“如果 __new__ 引发异常,您的对象将不会被创建并且 __del__ 不会被调用”。这并不总是正确的。这是一个示例,即使在 __new__ 中引发了异常,也会调用 __del__:

class test():
    def __new__(cls):
        obj = object.__new__(cls)
        raise
        return obj

    def __del__(self):
        print "__del__ called"

所以当我们在返回之前对 test 对象 obj 做一些事情时发生了一些异常。但由于对象已经创建,__del__ 被调用。教训是:__del__ 方法中,不要假设在 object.__new__() 实际上发生之后应该发生的任何事情 .否则,您可能会在尝试访问不存在的属性或依赖其他一些无效的假设时引发异常。该异常将被忽略,但 __del__ 应该完成的任何任务也会失败。

关于python - 是否在未完成初始化的对象上调用了 del?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6409644/

相关文章:

python - 获取类变量和值的字典

python - 如何将包含字典列表的字符串转换为 Python 对象?

python - 为什么 Python 导出的文件没有关闭?

python - 如何循环遍历 python 类对象中的所有变量(而不将它们转换为字符串)?

python - 在声明之前引用python中的类

python - 使用 Python Paramiko 在不同的 SSH 服务器中并行运行多个命令

python - 如何将 networkX 图导入到 neo4j?

python - Tensorflow-gpu 与 pyinstaller

python-3.x - 如何查找文件中重复的单词?

python - 如何激活每个项目并解析它们的信息?