我正在创建一个对象词典,我想在不同的时间保存和重新加载(我想用" json"模块执行此操作,而不是"泡菜"。)
我创建了一个类(让我们调用它" Ball"),字典只包含该类的许多不同实例。它的外观是:
my_dict = {
"ball1": {"size": "big", "baseball": False, etc...},
"ball2": {"size": "small", "baseball": True, etc...},
etc...
}
当我创建" Ball"的新实例时我只是将它们贴在" my_dict"。
上我的" Ball" class有一些方法可以让我改变某些字段的值......即:
changeSize(self, size)
问题:
为了让我能够使用json模块正常工作,我必须对" Ball"的每个新实例执行以下操作。类:
newBall = Ball(name)
my_dict[name] = newBall.__dict__
添加
.__dict__
然后将其附加到字典使其成为JSON可序列化的,但它使得当我进入"编辑模式"我无法调用该方法(即changeSize(name)),因为它只是一个字典而不再是" Ball"对象
如何制作它以便我可以保存(使用json模块)并使用我现有的方法进行编辑?
另外,我保存/加载的方式如下:
out_file = open("testSave.json"), "w")
json.dump(my_dict, out_file, indent=4)
out_file.close()
in_file = open("testSave.json", "r")
my_dict = json.load(in_file)
in_file.close()
谢谢!
答案 0 :(得分:1)
最终,json
不支持序列化任意python对象。如果您想这样做,可以查看pickle
。
或者,您可以在Ball
上创建一个替代构造函数,使用dict
中的值对其进行初始化:
class Ball(object):
@classmethod
def from_json(self, dictionary):
b = cls()
b.__dict__.update(dictionary)
return b
...
我已经写过这个假设Ball
构造函数可以使用0
参数调用 - 如果不是这样,你可能需要修改代码,或者如果__init__
做任何事情"幻想" (除了设置json
可序列化属性)。围绕__init__
参数要求的一种方法是使用__new__
创建实例,然后通过更新类字典来填充成员:
class Ball(object):
def __init__(self, name, foo, bar):
self.name = name
self.foo = foo
self.bar = bar
def to_dict(self):
return self.__dict__
@classmethod
def from_dict(cls, dictionary):
self = cls.__new__(cls)
self.__dict__.update(dictionary)
return self
def __str__(self):
return 'Ball(%r, %r, %r)' % (self.name, self.foo, self.bar)
b = Ball('HockyPuck', 'flat', 'NotABall')
d = b.to_dict()
bb = Ball.from_dict(d)
print(bb)
这适用于python2.x和3.x。