python复杂对象创建

2024-10-01 00:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,需要帮助解决以下问题

我必须创建名为Error的python对象,然后以json格式打印它: 下面是指向对象结构图像的链接 enter image description here

数据类

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))

进程类--

class Process:

    def __init__(self, id:str,flow:str,flowSubType:str):
        self.id= id
        self.flow= flow
        self.flowSubType= flowSubType

    def get_id(self):
        return self.id

    def set_id(self, id):
        self.id = id

    def get_flow(self):
        return self.flow

    def set_flow(self, flow):
        self.flow = flow

    def get_flowSubType(self):
        return self.flowSubType

    def set_flowSubType(self, flowSubType):
        self.flowSubType = flowSubType

根本原因类--

class RootCause:

    def __init__(self,system:str, code:str,message:str,timeStamp:str):
        self.system= system
        self.code= code
        self.message= message
        self.timeStamp= timeStamp

    def get_system(self):
        return self.system

    def set_system(self, system):
        self.system = system

    def get_code(self):
        return self.code

    def set_code(self, code):
        self.code = code

    def get_message(self):
        return self.message

    def set_message(self, message):
        self.message = message

    def get_timeStamp(self):
        return self.timeStamp

    def set_timeStamp(self, timeStamp):
        self.timeStamp = timeStamp

错误类别:

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"
            }
        }
    ]
}

有人能帮我解决这个问题吗


Tags: selfidmessagedatagetreturndeffilename
1条回答
网友
1楼 · 发布于 2024-10-01 00:35:28

有两种方法可以获得所需的输出

方法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数据模型是一个很好的实践,但是__dict__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(例如,在返回之前从公制转换为英制),则很容易将其添加到属性装饰器中。

相关问题 更多 >