如何将 dict 转换为 Python 中的 class 属性

How to convert dict to class attributes in Python

我们将完全采用 OOPS 方法,将数据存储为 class 属性,并根据需要调用定义的 get 方法,而不是使用字典来存储和传递数据。

我在 Java 中实现了这一点,但在 Python 中遇到了一些麻烦。任何解决方案都会有所帮助。

import json

class InputModel:
    def __init__(self, input_payload):
        self.id1 = input_payload["id1"]
        self.route = RouteModel(input_payload["route"])
        self.id2 = input_payload["id2"]
        self.id3 = input_payload["id3"]
        self.id4 = input_payload["id4"]
        self.id5 = input_payload["id5"]

        def get_id1(self):
            return self.id1

        #similar for other ids


class RouteModel:
    def __init__(self, input_payload_route):
        self.id6 = input_payload_route["id6"]
        self.id7 = input_payload_route["id7"]
       
        def get_id6(self):
            return self.id6

        #similar for other ids
        
        

json_str = '{"id1":"string","route":{"id6":"string","id7":"string"},"id2": "string","id3": "string","id4": "string","id5": "string"}'
json_dict = json.loads(json_str)
im = InputModel(json_dict)
print(im.get_id1())
print(im.get_id6())

无法访问嵌套的 class 属性

您似乎在 class 方法中增加了 1 个缩进,因此您无法访问它们。

此外,要到达 RouteModel 的 id6,您必须先参考 'route':

import json

class InputModel:
    def __init__(self, input_payload):
        self.id1 = input_payload["id1"]
        self.route = RouteModel(input_payload["route"])
        self.id2 = input_payload["id2"]
        self.id3 = input_payload["id3"]
        self.id4 = input_payload["id4"]
        self.id5 = input_payload["id5"]

    def get_id1(self):
        return self.id1

        #similar for other ids


class RouteModel:
    def __init__(self, input_payload_route):
        self.id6 = input_payload_route["id6"]
        self.id7 = input_payload_route["id7"]
    
    def get_id6(self):
        return self.id6

        #similar for other ids
        
        

json_str = '{"id1":"string","route":{"id6":"string","id7":"string"},"id2": "string","id3": "string","id4": "string","id5": "string"}'
json_dict = json.loads(json_str)
im = InputModel(json_dict)
print(im.get_id1())
print(im.route.get_id6())

输出:

string
string

问题是你只是在你的本地范围内定义get_id*,如果你坚持在__init__方法中定义它,你需要将它分配给实例。

我最小化了您的代码示例以隔离您的问题。

class RouteModel:
    def __init__(self):
        self.id6 = "foo"

        def get_id6(self_=self):
            return self_.id6

        self.get_id6 = get_id6

rm = RouteModel()
print(rm.get_id6())

>>> "foo"

如果我对你的问题的理解正确,你希望能够直接访问 id 作为属性,无论它们在字典中的嵌套有多深。
此解决方案以递归方式创建属性:

import json

class InputModel:
    def __init__(self, payload):
        self.create_attrs(payload)

    def create_attrs(self, d):
        for key, value in d.items():
            # if the value is a dict, call create_attrs recursively
            if isinstance(value, dict):
                self.create_attrs(value)
            else:
                # create an attribute key=value, e.g. id1="string"
                setattr(self, key, value)


json_str = '{"id1":"string","route":{"id6":"string","id7":"string"},"id2": "string","id3": "string","id4": "string","id5": "string"}'
json_dict = json.loads(json_str)
im = InputModel(json_dict)

print(im.id1)
print(im.id6)

在查看提供的答案后,大多数都定义了实例属性,而不是 class 属性。

如果我在这里错了请纠正我,但我认为 class 属性是这样定义的,对吗?

import json

class InputModel:
    def __init__(self, input_payload):
        InputModel.id1 = input_payload["id1"]
        InputModel.route = RouteModel(input_payload["route"])
        InputModel.id2 = input_payload["id2"]
        InputModel.id3 = input_payload["id3"]
        InputModel.id4 = input_payload["id4"]
        InputModel.id5 = input_payload["id5"]

        def get_id1():
            return InputModel.id1
        #OR
        #@classmethod
        #def get_id1(cls):
        #    return cls.id1

        #similar for other ids


class RouteModel:
    def __init__(self, input_payload_route):
        RouteModel.id6 = input_payload_route["id6"]
        RouteModel.id7 = input_payload_route["id7"]
       
        def get_id6():
            return RouteModel.id6

        #similar for other ids
        
        

json_str = '{"id1":"string","route":{"id6":"string","id7":"string"},"id2": "string","id3": "string","id4": "string","id5": "string"}'
json_dict = json.loads(json_str)

InputModel(json_dict)
print(InputModel.get_id1())
print(InputModel.route.get_id6())
print(RouteModel.get_id6())