python - 如果实例记录在类字典中,__del__ 不起作用

标签 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
>>> 

我不明白为什么会发生这种情况,有人有建议吗?

最佳答案

仅当代码中不再有对该对象的引用时,才会调用

__del__ 。当对对象使用 del 关键字时,它不会(必然)被调用。

当您启动一个Test实例时,您最终会得到2个引用——aTest中的一个额外引用.instances 字典。执行del a只会删除引用aTest.instances 引用仍然存在,因此 __del__ 不会被调用。

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

关于python - 如果实例记录在类字典中,__del__ 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777235/

相关文章:

Python 3 正则表达式和 Unicode 表情

python - 是否可以从 Django 中的 concat 内部获取显示名称?

html - 在 DIV 容器内的类中维护图像的比率

php - 在 PHP 中处理具有数十个(大约 50 个)属性的客户类的推荐方法是什么?

c++ - 如何将 enable_if 用于模板类成员的外联定义

python - pandas 数据框滚动窗口中的最大日期

python - 如何在 Python Flask 中创建带有可选参数的 SQL 查询?

python - 使用 OpenCV Python,显微视频

python - 为什么不调用字符串方法(如 .replace)修改(变异)字符串?除非我分配结果,否则为什么它不会改变?

python - 检查数字是否在 Python 中的或多或少的范围内