es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir un diccionario en atributos de clase en Python

En lugar de usar un diccionario para almacenar y pasar datos, estamos utilizando una aproximación de OOPS para almacenar los datos como atributos de clase y llamar a los métodos get definidos según sea necesario.

En Java pude lograr esto, pero tengo algunos problemas en Python. Cualquier solución sería útil.

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 para los otros 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 para los otros 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())

no puedo acceder a los atributos de la clase anidada

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el método get_id6() está definido dentro de la clase RouteModel, en lugar de la clase InputModel. Por lo tanto, al llamar a im.get_id6(), no se encuentra en InputModel y se genera un error.

    Para acceder a los atributos de la clase anidada, puedes definir un método get_route() en la clase InputModel que devuelva el objeto RouteModel, y luego llamar al método get_id6() en ese objeto. Por ejemplo:

    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
    
        def get_route(self):
            return self.route
    
    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
    
    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())
    route = im.get_route()
    print(route.get_id6())
    

    En esta implementación modificada, al llamar a im.get_route() se devuelve el objeto RouteModel, el cual luego se puede utilizar para acceder al atributo id6 con route.get_id6().

Comments are closed.