Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将类传递给json的最佳实践是什么?_Python_Json_Class - Fatal编程技术网

Python 将类传递给json的最佳实践是什么?

Python 将类传递给json的最佳实践是什么?,python,json,class,Python,Json,Class,问题:我有一个类的实例,我想将该类的主信息传递为json兼容的格式。我经常求助于创建一个to_dict方法,如下所示: class A: def __init__(self, name, val): self.name = name self.val = val def to_dict(self): return { 'name': self.name, 'val': self.va

问题:我有一个类的实例,我想将该类的主信息传递为json兼容的格式。我经常求助于创建一个to_dict方法,如下所示:

class A:
    def __init__(self, name, val):
        self.name = name
        self.val = val

    def to_dict(self):
        return {
            'name': self.name,
            'val': self.val,
        }
那我就可以了

a = A("a_name", 5)
a.to_dict()
它输出
{'name':'a_name','val':5}

不过我觉得有点不雅。我考虑过修改
\uuuu repr\uuuuu
,但我不认为这样更好,因为有时我想要一个不是dict的repr


所以我的问题是:在python中有更好的方法来实现这一点吗?

有几种替代方法。例如,您可以使实例可移植,并让其产生键/值对。然后使用字典构造函数获取这些键/值对:

class A:
    def __init__(self, name, val):
        self.name = name
        self.val = val

    def __iter__(self):
        yield "name", self.name
        yield "val", self.val

a = A("Helen", 42)
d = dict(a)

您也可以使用
\uuuu dict\uuuu

根据上面的例子:

A类:
定义初始值(self、name、val):
self.name=名称
self.val=val
a=a(“海伦”,42岁)
打印(a.。uuuu dict_uuuu)
#>>{'name':'Helen','val':42}
上面写着:

要扩展此功能以识别其他对象, 子类并实现一个 方法和另一个方法,该方法为
o
如果可能,否则它应该调用超类实现 (提出)

所以你可以做一些像

从json导入JSONEncoder
类MyJSONEncoder(JSONEncoder):
def默认值(自身,o):
如果存在(o,A):
返回f'{“name”:“{o.name}”,“value”:{o.value}”
返回super()。默认值(o)
# ... 
打印(json.dumps(something,cls=MyJSONEncoder))
最后我稍微概括了一下,就是说

    def default(self, o):
        if hasattr(o, '__json__'):
            return o.__json__()
        return super().default(o)

然后在我想要为其指定json序列化格式的类中定义一个
\uuuu json\uuuu
方法。

a
to_dict
方法是完全合理的。我不确定实现
\uuuu repr\uuuu
对您有什么好处,这与JSON无关。注意,通常,您的
to dict
可以是
返回变量(self)
尽管您必须小心,但如果您不了解dict是您实例的名称空间,并且这些更改将在您的实例中可见,则不要对其进行变异。这是一个出色的解决方案。它甚至可以递归地工作!我用一个类测试了它,其中一个属性是另一个类的实例。属性值正确打印为dict。