对 dict 进行子类化以从 JSON 文件为其提供初始值无法按预期工作

问题描述 投票:0回答:1

我有 C/C++ 背景

我想对 dict 进行子类化,使其能够自动打开 JSON 文件。 这是代码和问题:

class DictFromJSON(dict):
    def get_from_file(self, filename):
        with open(filename,) as file_reader:
            self = json.load(file_reader)
        print(self)

    def save(self, filename):
        with open(filename, "w") as file_writer:
            json.dump(self, file_writer)

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.save()

    def __init__(self, filename, *args):
        super().__init__(args)
        self.get_from_file(filename)

json_dict = DictFromJSON("myjson.json")
print(json_dict)

用于测试的 JSON 文件包含单个变量 mykey

此输出:

{'mykey': True}
{}

所以它正确打开文件,

print(self)
输出预期的结果,但是当我打印用该类创建的变量时,它仍然是空的。

我尝试过几种不同的方式从

self
分配
json.load()
,包括迭代键,但这也不起作用

python subclassing
1个回答
0
投票

分配给本地名称

self
不会更新对象。你需要使用
update
:

class DictFromJSON(dict):
    def get_from_file(self, filename):
        with open(filename,) as file_reader:
            self.update(json.load(file_reader))

    def save(self, filename):
        with open(filename, "w") as file_writer:
            json.dump(self, file_writer)

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.save()

    def __init__(self, filename, *args):
        super().__init__(args)
        self.get_from_file(filename)

但是,我可能会确保加载的对象用于创建

dict
,而不是在创建后更新它。

class DictFromJson(dict):
    def __new__(cls, filename):
        with open(filename) as file_reader:
            return cls(json.load(file_reader))

    def __init__(self, filename):
        self.filename = filename

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.save()

    def save(self):
        with open(self.filename, 'w') as f:
            json.dump(self, f)
© www.soinside.com 2019 - 2024. All rights reserved.