首页 > 解决方案 > 当我更改嵌套字典中的值时会调用什么方法?

问题描述

我试图通过包装类型dict并特别重载__setitem__将值写入文件来创建一个持久字典。

class PersistentStorage(dict):
    def __init__(self, file_name, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.path = file_name

    def write_dict(self):
        with open(self.path, "w") as f:
            json.dump(self, f)

    def __setitem__(self, key, value):
        super().__setitem__(key,value)
        self.write_dict() # writes 'self' to a json file.

只要我不使用嵌套字典,这将按预期工作:

tester = PersistenStorage("example_path.json")

tester["key1"] = "Value for key 1"
# works and gets saved
tester["key2"] = {"subkey":""}
# works as well
tester["key2"]["subkey"] = "Added value"
# works locally but is not written to file (__setitem__ is not called)

我也尝试重载该类的其他方法,但似乎找不到在这种情况下被调用的方法。我也不明白为什么__setitem__不叫。

我也研究过typingcollections但在我看来,直接dict用作模板类是最好的选择,因为我不想改变类型的固有功能,而只是扩展读写。

标签: pythondictionary

解决方案


调用此代码:

tester["key2"]["subkey"] = "Added value"

相当于以下两行:

key2_value = tester["key2"]
key2_value["subkey"] = "Added value"

在第一行,PersistentStorage.__getitem__被称为(因为tester是 a PersistentStorage

在第二行中,dict.__setitem__被称为(因为key2_value是 a dict)。

如果要覆盖该设置器,则不应使用“正常”dict作为tester["key2"].

例如,您可以更改此行:

tester["key2"] = {"subkey":""}

对此:

tester["key2"] = MyDictWithOverridden_setitem({"subkey":""})

然后实施MyDictWithOverridden_setitem,或任何你称之为的东西,例如

class MyDictWithOverridden_setitem(dict):
    def __setitem__(self, key, value):
        do_something_special()

推荐阅读