__dict__不允许在Python中调用方法

时间:2016-07-12 20:52:54

标签: python json dictionary methods save

我正在创建一个对象词典,我想在不同的时间保存和重新加载(我想用" 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()

谢谢!

1 个答案:

答案 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。