Estoy intentando imprimir un diccionario de todas las propiedades dentro de la instancia de la clase, sin embargo, cuando hay otra clase como una de las propiedades, también tengo problemas para imprimir un diccionario de sus propiedades. Esto es algo difícil de explicar para mí, así que creo que un ejemplo será más fácil de entender.

class A:
  def __init__(self):
    self.x = "x"
    self.b = B(self)
  def __str__(self):
    self.__dict__["b"] = vars(self.__dict__["b"])
    return str(self.__dict__)
  
class B:
  def __init__(self, a):
    self.a = a
    self.y = "y"
    self.c = C(self)
  def __str__(self):
    self.__dict__["c"] = vars(self.__dict__["c"])
    return str(temp)

class C:
  def __init__(self, b):
    self.b = b
    self.z = "z"
  def __str__(self):
    return str(self.__dict__)

print(A())

Salida:

{'x': 'x', 'b': {'a': <__main__.A object at 0x7f1913e47460>, 'y': 'y', 'c': <__main__.C object at 0x7f1913e2dbe0>}}

Salida esperada:

{'x': 'x', 'b': {'a': <__main__.A object at 0x7fe0becea460>, 'y': 'y', 'c': {'b': <__main__.B object at 0x7f8e7224bc40>, 'z': 'z'}}}

En última instancia, quiero que mi resultado sea este:

{'x': 'x', 'b': {'y': 'y', 'c': {'z': 'z'}}

Entonces, si alguien pudiera ayudarme deduciendo mi error en el paso intermedio o resolviendo el problema directamente para llevarme a lo que quiero, realmente lo agradecería. ¡Gracias!

0
Shivang Patel 27 jul. 2020 a las 11:47

1 respuesta

La mejor respuesta

Por segundo, puede usar esto o cambiarlo según su necesidad:

from ast import literal_eval
class A:
    def __init__(self):
        self.x = "x"
        self.b = B(self)

    def __str__(self):
        o = {}
        for x in self.__dict__:
            if isinstance(self.__dict__[x], str):
                o[x] = self.__dict__[x]
        o['b'] = literal_eval(str(self.b))
        return str(o)


class B:
    def __init__(self, a):
        self.a = a
        self.y = "y"
        self.c = C(self)

    def __str__(self):
        o = {}
        for x in self.__dict__:
            if isinstance(self.__dict__[x], str):
                o[x] = self.__dict__[x]
        o['c'] = literal_eval(str(self.c))
        return str(o)


class C:
    def __init__(self, b):
        self.b = b
        self.z = "z"

    def __str__(self):
        o = {}
        for x in self.__dict__:
            if isinstance(self.__dict__[x], str):
                o[x] = self.__dict__[x]
        return str(o)
print(A())

Y por primera vez debería usar str en lugar de var

class A:
  def __init__(self):
    self.x = "x"
    self.b = B(self)
  def __str__(self):
    self.__dict__["b"] = str(self.__dict__["b"])
    return str(self.__dict__)

class B:
  def __init__(self, a):
    self.a = a
    self.y = "y"
    self.c = C(self)
  def __str__(self):
    self.__dict__["c"] = str(self.__dict__["c"])
    return str(self.__dict__)

class C:
  def __init__(self, b):
    self.b = b
    self.z = "z"
  def __str__(self):
    return str(self.__dict__)

print(A())
1
Ali Fallah 29 jul. 2020 a las 20:06