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