Python: Zugreifen auf Attribute und Methoden einer Klasse in einer anderen Klasse

8

Nehmen wir an, ich habe zwei Klassen A und B:

%Vor%

Nun kann ich die Eigenschaften von A im Objekt der Klasse B wie folgt bewerten:

%Vor%

Was ich brauche, ist ein Zwei-Wege-Zugang. Wie greife ich auf die Eigenschaften von A in den Eigenschaften von B und B in A zu?

    
oat 29.06.2013, 18:59
quelle

3 Antworten

10

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".

    
Martijn Pieters 29.06.2013, 19:01
quelle
5

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.

    
Morgan Wilde 29.06.2013 19:07
quelle
3

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.

    
thefourtheye 30.06.2013 05:20
quelle

Tags und Links