python复杂对象创建

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

我是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 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),那么很容易将其添加到属性装饰器中


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

方法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),那么很容易将其添加到属性装饰器中


我将首先询问所有这些getter和setter。您是从Java来到Python的吗?这些是不需要的。我们可以直接在Python中使用属性。其次,请帮助我找到student的定义位置?我看不到student在这行中是什么:json_data=json.dumps(student,default=lambda o:o.\uu dict\uuuu)尼尔说的,加上“每班一个文件”thingie完全不是python。@neil-问题1-是的,我是一名java开发人员,这是我第一次与python交互。问题2-很抱歉提到学生,应该是错误。我现在编辑了它。你现在可以检查它。@bruno-哦,我明白了。实际上我不熟悉这个概念。我正在尝试实现它用与java相同的方式输入。你介意让我知道什么是最好的方法吗?我首先要问一下所有这些getter和setter。你是从java来Python的吗?这些是不需要的。我们可以直接在Python中使用属性。第二,请帮我找到student是在哪里定义的?我看不出是什么学生在这行:json_data=json.dumps(学生,默认值=lambda o:o.uu dict_uu)Neil所说的,加上“每个类一个文件”thingie完全不是python。@neil-问题1-是的,我是一名java开发人员,这是我第一次与python交互。问题2-很抱歉提到学生,应该是错误。我现在编辑了它。你现在可以检查它。@bruno-哦,我明白了。实际上我不熟悉这个概念。我正在尝试实现它请你告诉我什么是最好的方法好吗?这个解决方案已经成功了。非常感谢你提供的详细信息,它帮助我获得了一些关于python的有用提示。这个解决方案已经成功了。非常感谢你提供的详细信息,它帮助我获得了一些关于python的有用提示.