如果实例记录在类字典

时间:2016-09-29 18:11:38

标签: python class python-3.x dictionary

我想在字典中注册我班上的每个实例,键是其中一个参数。

这似乎有效,但__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
>>> 

我不明白为什么会这样,有人有什么建议吗?

1 个答案:

答案 0 :(得分:2)

只有在代码中没有对该对象的引用时才会调用

__del__。在对象上使用del关键字时,不是(必然)调用。

当您launch Test个实例时,您最终会得到2个引用 - a以及Test.instances dict中的额外引用。执行del a只会删除引用aTest.instances引用仍然存在,因此不会调用__del__

管理对象引用的一种(可能)更好的方法是将weakref存储到对象。在这种情况下,您可能会Test.instances成为weakref.WeakValueDictionary