如何可靠触发Python对象的__del__方法?
如何让Python对象销毁时立即可靠调用__del__方法
我希望对象被销毁时能立即、可靠地调用其__del__方法。我知道Python 2里存在相关问题,但Python 3文档明确说明当引用计数为0时会调用__del__,可我的程序并未达到预期效果:
import time class MyClass: object_list = [] def __init__(self): MyClass.object_list.append(self) print("object initialized") def __del__(self): print("executing cleanup steps") MyClass.object_list.remove(self) a = MyClass() b = MyClass() c = MyClass() print(len(MyClass.object_list)) del b time.sleep(1) print("sleep finished") print(len(MyClass.object_list))
我想要实现的目标是:对象销毁时立即将b从object_list中移除,同时让变量b无法访问。仅调用b.__del__()并不足够,还需让b不可访问。需要注意的是:先调用b.__del__()再执行del b会导致Python解释器退出时报错。
有意思的是,一个结构非常相似的程序在执行del b时会立即调用b.__del__():
import time class MyClass: counter = 0 def __init__(self, value): self.value = value print("object initialized") MyClass.counter+=1 def __del__(self): print("executing cleanup steps") MyClass.counter-=1 a = MyClass(5) b = MyClass(6) c = MyClass(7) print(MyClass.counter) del b time.sleep(1) print("sleep finished") print(MyClass.counter)
编辑
@Pranav Hosangadi指出object_list中仍保留着对象的引用,这是我的疏忽。现在我想到一个临时解决方案:先调用b.__del__()再执行del b,但这是两步操作,我希望能一步完成:
import time class MyClass: object_list = [] def __init__(self, value): self.value = value MyClass.object_list.append(self) print("object initialized") def __del__(self): print("executing cleanup steps") try: MyClass.object_list.remove(self) except: pass a = MyClass(1) b = MyClass(2) c = MyClass(3) print(len(MyClass.object_list)) b.__del__() del b time.sleep(1) print("sleep finished") print(len(MyClass.object_list))
内容的提问来源于stack exchange,提问作者laolux
相关产品推荐
相关产品推荐

