class test():
def __init__(self):
raise
def __del__(self):
print "__del__ called"
try:
test()
except:
pass
对
当删除对对象的最后一个引用时,将调用Explanation: __del__
.但是如果没有捕获异常,将不会调用__del__
,因为python仍然在堆栈中保留对该对象的引用,并且会一直保留到程序退出以打印回溯.如果捕获并处理异常,那么一旦从堆栈中丢弃与异常相关的所有信息,对象就会被删除.
当然,如果程序即将退出,__del__
也不一定能成功运行,除非谨慎行事,在某些情况下甚至不能成功运行——参见__del__
warning.
Addenum:塞德里克·朱利安(Cédrik Julien)在他的回答(现已修订)中说:"If 100 raised an exception, your object won't be created and 101 won't be called".这并不总是正确的.下面是一个调用__del__
的示例,尽管在__new__
中引发了异常:
class test():
def __new__(cls):
obj = object.__new__(cls)
raise
return obj
def __del__(self):
print "__del__ called"
因此,在返回之前,我们对test
对象obj
做了一些操作,出现了一些异常.但由于对象已经创建,因此调用__del__
.教训是:in the 102 method, don't assume anything that was supposed to happen after 104 has in fact happened.否则,您可能会在try 访问不存在的属性时引发异常,或者依赖于其他无效的假设.例外情况将被忽略,但__del__
本应完成的任何任务也将失败.