HOWTO · Python

So definieren Sie eine Klassenvariable in Python

Lernen Sie, ein Python-Klassenattribut im Klassenrumpf zu definieren, mit ClassName.attribute darauf zuzugreifen und es von einem auf Modulebene mit global deklarierten Namen zu unterscheiden.

Auf dieser Seite

Eine Python-Klassenvariable ist ein Attribut, das im Klassenrumpf zugewiesen wird. Definieren Sie es einmal für die Klasse und lesen Sie es anschließend über ClassName.attribute aus, zum Beispiel mit Tesla.speed. Ein global-Name ist davon getrennt: Er gehört zum Modul-Namensraum und wird nicht zu einem Klassenattribut.

Eine Klassenvariable in Python definieren

Weisen Sie den Wert im Klassenrumpf zu und lesen Sie ihn anschließend über den Klassennamen aus. Das Beispiel zeigt außerdem eine Methode und eine zweite Klasse, die dasselbe Attribut auslesen.

class Tesla:
    speed = 60

    def show_speed(self):
        return Tesla.speed


class Dashboard:
    def show_tesla_speed(self):
        return Tesla.speed


print(Tesla.speed)
print(Tesla().show_speed())
print(Dashboard().show_tesla_speed())
60
60
60

Hier wird speed in Tesla gespeichert, daher liest Tesla.speed das gemeinsame Klassenattribut aus. Die Methoden in Tesla und Dashboard greifen beide mit demselben klassenqualifizierten Ausdruck darauf zu. Die Ausgabe besteht aus drei Zeilen, in denen jeweils 60 steht.

Auf eine Klassenvariable außerhalb ihrer Klasse zugreifen

Verwenden Sie ClassName.attribute, sobald die Klasse verfügbar ist. Beispielsweise funktioniert Tesla.speed sowohl auf Modulebene als auch in der Methode einer anderen Klasse. Zum Auslesen eines Klassenattributs müssen Sie keine Instanz erstellen. Ein einzelner Name wie speed außerhalb der Klasse verweist nicht auf Tesla.speed; Python sucht ihn im aktuellen Gültigkeitsbereich, wo er möglicherweise nicht definiert ist.

Eine Instanz kann ebenfalls ein Attribut mit demselben Namen definieren. Zum Beispiel legt car.speed = 80 ein Attribut für genau diese Instanz car fest, während Tesla.speed weiterhin auf das Klassenattribut verweist. Verwenden Sie die klassenqualifizierte Schreibweise, wenn Sie ausdrücklich den gemeinsamen Wert benötigen.

Warum global keine Klassenvariable definiert

Die Anweisung global teilt Python mit, dass eine Zuweisung an einen einzelnen Namen in einem Codeblock diesen Namen im Modul-Namensraum binden soll. Steht global speed im Klassenrumpf und folgt darauf speed = 60, wird der Modulname speed erstellt oder aktualisiert; Tesla.speed wird dadurch nicht zugewiesen. Um eine Klassenvariable zu definieren, schreiben Sie im Klassenrumpf eine Zuweisung wie speed = 60 ohne global und greifen außerhalb der Klasse mit Tesla.speed darauf zu.

Eine Methode, die das Klassenattribut benötigt, kann ebenfalls Tesla.speed verwenden. Soll die Methode auch mit Unterklassen funktionieren, verwenden Sie je nach gewünschtem Suchverhalten type(self).speed oder self.speed; bei self.speed kann ein Instanzattribut gefunden werden, das das Klassenattribut überschattet.