Erzeugt statische Instanzen einer Klasse innerhalb der Klasse in Python

8

Entschuldigung, wenn ich die Terminologie hier falsch verstanden habe - ich kann mir nicht vorstellen, wie diese spezielle Redewendung heißen würde.

Ich habe versucht, eine Python 3-Klasse zu erstellen, die Instanzen von sich selbst in sich selbst deklariert - so ähnlich wie eine Enumeration. Hier ist eine vereinfachte Version des Codes, den ich geschrieben habe:

%Vor%

Dies schreibend, habe ich eine Ausnahme in Zeile 2 ( A = Test("A") ). Ich nehme an, Zeile 3 wäre auch fehlerhaft, wenn es so weit gekommen wäre. Die Verwendung von __class__ anstelle von Test führt zu demselben Fehler.

%Vor%

Gibt es eine Möglichkeit, in Python auf die aktuelle Klasse in einem statischen Kontext zu verweisen? Ich könnte diese speziellen Variablen außerhalb der Klasse oder in einer separaten Klasse deklarieren, aber aus Gründen der Klarheit möchte ich lieber nicht, wenn ich es helfen kann.

Um besser zu demonstrieren, was ich versuche, hier ist das gleiche Beispiel in Java:

%Vor%

Dies funktioniert so, wie Sie es erwarten würden: Es wird gedruckt:

%Vor%

Wie kann ich das Gleiche in Python machen?

    
Samir Talwar 30.03.2010, 15:49
quelle

3 Antworten

9

Nachdem Sie die Klasse definiert haben, fügen Sie einfach diese zwei Zeilen hinzu:

%Vor%

Eine Klasse in Python ist ein Objekt wie jedes andere und Sie können jederzeit neue Variablen hinzufügen. Sie können es einfach nicht innerhalb der Klasse tun, da es zu diesem Zeitpunkt nicht definiert ist (es wird nur dann in die Symboltabelle eingefügt, wenn der gesamte Code für die Klasse korrekt analysiert wurde).

    
Aaron Digulla 30.03.2010, 15:52
quelle
2

In Python ist ein class -Block nicht nur eine Deklaration; Es wird zur Laufzeit ausgeführt, um die Klasse zu erstellen. Jedes def innerhalb der Klasse baut eine Funktion auf und bindet den Namen in den Klassenraum der Klasse. Aus diesem Grund können Sie A = MyClass() nicht direkt im Klassenblock ausführen, da MyClass() erst vollständig definiert ist, wenn der Klassenblock geschlossen wird. Hier ist, wie es geht:

%Vor%     
Daniel Stutzbach 30.03.2010 15:59
quelle
2

Während die Antwort von Aaron der bevorzugte Weg ist, können Sie auch Metaklassen verwenden:

%Vor%     
mg. 30.03.2010 16:01
quelle

Tags und Links