我有 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()
,包括迭代键,但这也不起作用
分配给本地名称
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)