gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:51:17 26 4
gpt4 key购买 nike

如果对象的 __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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com