Sie müssen Zeiger in beide Richtungen erstellen:
%Vor% Jetzt kann sich A
auf self.parent
beziehen (sofern es nicht None
ist), und B
kann sich auf self.child
beziehen. Wenn Sie versuchen, eine Instanz von A
das untergeordnete Element von mehr als einem B
zu erstellen, gewinnt das letzte "übergeordnete Element".
Planen Sie Ihre Objekte einfach so, dass dies durch Vererbung sichergestellt werden kann.
%Vor% In diesem Fall könnten Sie, indem Sie vorausplanen, einfach C
für ein generalistisches Objekt und A
mit B
für spezialisiertere / nackte Eltern verwenden.
Diese Methode ist sehr nützlich, da Sie Objekte beider Klassen synonym verwenden können. Es gibt ein ernsthaftes Problem damit, das werde ich am Ende erklären.
%Vor%Erläuterung:
Gemäß dieser Seite , wird __getattr__
und __setattr__
angezeigt Wird nur bei Python-Objekten aufgerufen, wenn das angeforderte Attribut nicht im Bereich des jeweiligen Objekts gefunden wird. Also stellen wir im Konstruktor eine Beziehung zwischen den beiden Klassen her. Und dann, wenn __getattr__
oder __setattr__
aufgerufen wird, verweisen wir das andere Objekt mit getattr
method. ( getattr , setattr ) Wir verwenden __dict__
, um Werte im Konstruktor zuzuweisen, so dass wir nicht __setattr__
oder __getattr__
aufrufen.
Beispielruns:
%Vor%Nun, das ernsthafte Problem:
Wenn wir versuchen, auf ein Attribut zuzugreifen, das in diesen beiden Objekten nicht vorhanden ist, landen wir in unendlicher Rekursion. Sagen wir, ich möchte 'C' von 'a' zugreifen. Da C nicht in a ist, ruft es __getattr__
auf und verweist auf b object. Da das Objekt kein C hat, ruft es __getattr__
auf, was das Objekt a referenziert. Wir enden also in einer unendlichen Rekursion. Dieser Ansatz funktioniert also gut, wenn Sie auf nichts zugreifen, was den beiden Objekten unbekannt ist.