Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.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 建模&x27;有一个';关系_Python - Fatal编程技术网

Python 建模&x27;有一个';关系

Python 建模&x27;有一个';关系,python,Python,我试图对描述汽车的JSON进行建模: { colour : "green" specs : { brakes : "good brakes" } } 汽车与规格“有”关系。以下是我如何实现的: import json class Car : def __init__(self , colour, specs): self.colour = colour self.specs = specs class Spec

我试图对描述汽车的JSON进行建模:

{
colour : "green"
specs : {
brakes : "good brakes"
}
}
汽车与规格“有”关系。以下是我如何实现的:

import json

class Car :
    def __init__(self , colour, specs):
        self.colour = colour
        self.specs = specs

class Specs : 
    def __init__(self , brakes):
        self.brakes = brakes
        

specs = Specs("good brakes")
car = Car("Green" , specs) 

print(json.dumps(car.__dict__))
返回:

TypeError: Object of type Specs is not JSON serializable

< >为了建立“有A”关系,我应该在<代码> CAL/<代码>中创建我自己的TojJSON函数吗?

< P>你应该考虑为你的汽车类有一个类似于

的编码器类。
In [8]: import json
   ...:
   ...: class Car :
   ...:     def __init__(self , colour, specs):
   ...:         self.colour = colour
   ...:         self.specs = specs
   ...:
   ...: class Specs :
   ...:     def __init__(self , brakes):
   ...:         self.brakes = brakes
   ...:
   ...:
   ...: specs = Specs("good brakes")
   ...: car = Car("Green" , specs)
   ...:

In [9]:

In [10]: from json import JSONEncoder
    ...:

In [11]: class CarEncoder(JSONEncoder):
    ...:         def default(self, o):
    ...:             op =  o.__dict__
    ...:             op['specs'] =  o.specs.__dict__
    ...:             return op
    ...:
    ...:
    ...:

In [12]: json.dumps(car, cls=CarEncoder)
Out[12]: '{"colour": "Green", "specs": {"brakes": "good brakes"}}'

In [13]:

CarEncoder的默认方法将由json.dumps调用。在这里,我已经用规格字典替换了规范,

你应该考虑为你的汽车类有一个编码器类,比如

In [8]: import json
   ...:
   ...: class Car :
   ...:     def __init__(self , colour, specs):
   ...:         self.colour = colour
   ...:         self.specs = specs
   ...:
   ...: class Specs :
   ...:     def __init__(self , brakes):
   ...:         self.brakes = brakes
   ...:
   ...:
   ...: specs = Specs("good brakes")
   ...: car = Car("Green" , specs)
   ...:

In [9]:

In [10]: from json import JSONEncoder
    ...:

In [11]: class CarEncoder(JSONEncoder):
    ...:         def default(self, o):
    ...:             op =  o.__dict__
    ...:             op['specs'] =  o.specs.__dict__
    ...:             return op
    ...:
    ...:
    ...:

In [12]: json.dumps(car, cls=CarEncoder)
Out[12]: '{"colour": "Green", "specs": {"brakes": "good brakes"}}'

In [13]:

CarEncoder的默认方法将由json.dumps调用。在那里,我用规范字典替换了规范。

对您的方法进行了修改,以检查子对象是否具有DICT,在这种情况下以及其他简单情况下都可以使用。例如:

def to_dict(obj):
“”“将具有'\uuuu dict\uuuu'方法的对象转换为嵌套dict。”“”
返回{
键:如果hasattr(值,'.'.'指定'.''else值,则指定(值)'.'其他值
对于键,对象中的值
}
打印(json.dumps(to_dict(car)))
但在许多情况下,这一点会下降:

  • 如果在对象中使用
    \uuuuuuuuuuuuuuuuuuuuuuuu
  • 如果要支持属性或列表

您可以扩展该方法来尝试并解释其中的每一项,但现在可能是时候咬紧牙关,要么使用序列化库(如其他地方所建议的),要么将您自己的特定于对象的
编写到_dict()
如您所建议的方法。

对您的方法进行修改,以检查子对象是否具有DICT,在这种情况下以及其他简单情况下都可以使用。例如:

def to_dict(obj):
“”“将具有'\uuuu dict\uuuu'方法的对象转换为嵌套dict。”“”
返回{
键:如果hasattr(值,'.'.'指定'.''else值,则指定(值)'.'其他值
对于键,对象中的值
}
打印(json.dumps(to_dict(car)))
但在许多情况下,这一点会下降:

  • 如果在对象中使用
    \uuuuuuuuuuuuuuuuuuuuuuuu
  • 如果要支持属性或列表

您可以扩展该方法来尝试并解释其中的每一项,但现在可能是时候咬紧牙关,要么使用序列化库(如其他地方所建议的),要么将您自己的特定于对象的
编写到_dict()
如您所建议的方法。

您的类设计确实模拟了IMO之间的关系。但这不是您遇到的问题。一般来说,如果不做一些额外的工作,通用Python对象就不能被JSON序列化。添加“to_json”函数没有帮助。标准文档中有一些简单案例的插图。你到底想得到什么帮助?你的课堂设计确实模拟了这种关系。但这不是你面临的问题。一般来说,如果不做一些额外的工作,通用Python对象就不能被JSON序列化。添加“to_json”函数没有帮助。标准文档中有一些简单案例的插图。你到底需要什么帮助?