Próbuję wydrukować słownik wszystkich nieruchomości w instancji klasy, jednak gdy istnieje inna klasa jako jedna z właściwości, mam problemy z wydrukiem jego właściwości. Jest to dla mnie trudne do wyjaśnienia, więc myślę, że przykład będzie łatwiej zrozumieć.

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

Wynik:

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

Oczekiwany wynik:

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

Ostatecznie chcę, żeby moje wyjście było to:

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

Tak więc, jeśli ktoś mógłby pomóc albo poświęcić mój błąd w kroku pośrednim lub rozwiązywać problem, aby dostać mnie do tego, czego chcę, naprawdę bym to docenił. Dziękuję Ci!

0
Shivang Patel 27 lipiec 2020, 11:47

1 odpowiedź

Najlepsza odpowiedź

Na sekundę możesz użyć tego lub zmienić zgodnie z potrzebą:

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

I za pierwsze oczekiwane, powinieneś użyć str zamiast 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 lipiec 2020, 20:06