我想在字典中注册我班上的每个实例,键是其中一个参数。
这似乎有效,但__del__
函数失败。
这是代码:
class Test(object):
instances = {}
def __init__(self, id):
self.id = id
def launch(self):
print("launch")
Test.instances[self.id] = self
def __del__(self):
print("del")
del Test.instances[self.id]
以下是我得到的不同输出:
>>> a = Test(25)
>>> del a
del
>>> a = Test(25)
>>> a.launch()
launch
>>> del a
>>>
我不明白为什么会这样,有人有什么建议吗?
答案 0 :(得分:2)
__del__
。在对象上使用del
关键字时,不是(必然)调用。
当您launch
Test
个实例时,您最终会得到2个引用 - a
以及Test.instances
dict中的额外引用。执行del a
只会删除引用a
。 Test.instances
引用仍然存在,因此不会调用__del__
。
管理对象引用的一种(可能)更好的方法是将weakref
存储到对象。在这种情况下,您可能会Test.instances
成为weakref.WeakValueDictionary
。