python复杂对象创建
我是python新手,需要帮助解决以下问题 我必须创建名为Error的python对象,然后以json格式打印它: 下面是指向对象结构图像的链接 数据类python复杂对象创建,python,arrays,object,Python,Arrays,Object,我是python新手,需要帮助解决以下问题 我必须创建名为Error的python对象,然后以json格式打印它: 下面是指向对象结构图像的链接 数据类 class Data: def __init__(self,fileName:str, rowId:int, rowData:str): self.fileName = fileName self.rowId= rowId self.rowData = rowData def
class Data:
def __init__(self,fileName:str, rowId:int, rowData:str):
self.fileName = fileName
self.rowId= rowId
self.rowData = rowData
def get_fileName(self):
return self.fileName
def set_fileName(self, fileName):
self.fileName = fileName
def get_rowId(self):
return self.rowId
def set_rowId(self, rowId):
self.rowId = rowId
def get_rowData(self):
return self.rowData
def set_rowData(self, rowData):
self.rowData = rowData
错误类别:
from Process import Process
from RootCause import RootCause
import json
class Errors(object):
def __init__(self, process,rootCause):
self.process= process
self.rootCause= rootCause
def get_process(self):
return self.process
def set_process(self, process):
self.process = process
def get_rootCause(self):
return self.rootCause
def set_rootCause(self, rootCause):
self.rootCause = rootCause
def __str__(self):
return (json.dumps(self.process.get_flow))
过程类--
根本原因类--
错误类别:
from Data import Data
from Errors import Errors
from Process import Process
from RootCause import RootCause
from typing import List
import json
class Error(object):
def __init__(self,data,errors : List[Errors]):
self.data= data
self.errors= errors
def get_data(self):
return self.data
def set_data(self, data):
self.data=data
def get_errors(self):
return self.errors
def set_errors(self, errors):
self.errors = errors
def test():
data = Data('a',2,'b')
process = Process('id','flow','subtype')
rootCause = RootCause('sys','co','message','timestamp')
errors = [process, rootCause]
error = Error(data,errors)
json_data = json.dumps(error, default=lambda o: o.__dict__)
print(json_data)
test()
执行错误类后,我得到如下输出:
{
"data":
{
"fileName": "a",
"rowId": 2,
"rowData": "b"
},
"errors": [
{
"id": "id",
"flow": "flow",
"flowSubType": "subtype"
},
{
"system": "sys",
"code": "co",
"message": "message",
"timeStamp": "timesta"
}
]
}
{
"data": {
"fileName": "a",
"rowId": 2,
"rowData": "b"
},
"errors": [
{
"Process": {
"id": "id",
"flow": "flow",
"flowSubType": "subtype"
},
"error": {
"system": "sys",
"code": "co",
"message": "message",
"timeStamp": "timestamp"
}
}
]
}
但我需要打印输出的帮助,如下所示:
{
"data":
{
"fileName": "a",
"rowId": 2,
"rowData": "b"
},
"errors": [
{
"id": "id",
"flow": "flow",
"flowSubType": "subtype"
},
{
"system": "sys",
"code": "co",
"message": "message",
"timeStamp": "timesta"
}
]
}
{
"data": {
"fileName": "a",
"rowId": 2,
"rowData": "b"
},
"errors": [
{
"Process": {
"id": "id",
"flow": "flow",
"flowSubType": "subtype"
},
"error": {
"system": "sys",
"code": "co",
"message": "message",
"timeStamp": "timestamp"
}
}
]
}
有人能帮我解决这个问题吗。有两种方法可以获得所需的输出 方法1:将错误存储在字典而不是列表中:
class Error(object):
def __init__(self,data,errors : List[Errors]):
self.data= data
self.errors= {"Process": errors[0], "errors": errors[1]}
方法2(推荐),编写一个适当的asdict()函数(在有意义的地方,使用Python数据模型是一个很好的实践,但是\uuuuuuuuuuuuu
dunder有点挑剔,应该只用于检查对象,而不是获取业务案例格式的对象表示
class Error(object):
def __init__(self,data,errors : List[Errors]):
self.data= data
self.errors= errors
def asdict(self):
return {
"data": self.data.__dict__, # or you can write an asdict() on every class
"errors": {"process": self.errors[0].__dict__, "error": self.errors[1].__dict__}
}
您可以将其称为:
d = obj.asdict()
json.dumps(d) # will probably still need the default to handle those nested objects. unless you write asdict() methods on those too and call them above.
关于我评论中的另外一两点:
- 在Python中,我们可以像obj.attr一样直接访问对象属性
- 不需要getter和setter
- 如果您不希望有人访问某个变量,请在其前面加一个下划线。例如self.\u data这实际上没有任何作用,但按照惯例,Python编码人员知道不要使用下划线实例变量,或者如果不使用下划线实例变量,就接受其后果。因此,它就像一个软策略“私有”变量
- 如果接下来您需要一个实际执行某些操作的getter(例如,在返回之前从metric转换为imperial),那么很容易将其添加到属性装饰器中
class Error(object):
def __init__(self,data,errors : List[Errors]):
self.data= data
self.errors= {"Process": errors[0], "errors": errors[1]}
方法2(推荐),编写一个适当的asdict()函数(在有意义的地方,使用Python数据模型是一个很好的实践,但是\uuuuuuuuuuuuu
dunder有点挑剔,应该只用于检查对象,而不是获取业务案例格式的对象表示
class Error(object):
def __init__(self,data,errors : List[Errors]):
self.data= data
self.errors= errors
def asdict(self):
return {
"data": self.data.__dict__, # or you can write an asdict() on every class
"errors": {"process": self.errors[0].__dict__, "error": self.errors[1].__dict__}
}
您可以将其称为:
d = obj.asdict()
json.dumps(d) # will probably still need the default to handle those nested objects. unless you write asdict() methods on those too and call them above.
关于我评论中的另外一两点:
- 在Python中,我们可以像obj.attr一样直接访问对象属性
- 不需要getter和setter
- 如果您不希望有人访问某个变量,请在其前面加一个下划线。例如self.\u data这实际上没有任何作用,但按照惯例,Python编码人员知道不要使用下划线实例变量,或者如果不使用下划线实例变量,就接受其后果。因此,它就像一个软策略“私有”变量
- 如果接下来您需要一个实际执行某些操作的getter(例如,在返回之前从metric转换为imperial),那么很容易将其添加到属性装饰器中