2.20. First Class

Eine Klasse gruppiert Daten und die Funktionen, die auf diese Daten wirken, unter einem einzigen Namen. Der Griff zu einer Klasse lohnt sich, wenn mehrere Zustandsteile zusammengehören und die meisten Funktionen in einem Skript dieselbe Menge an Werten als Argumente entgegennehmen.

2.20.1. Das Schlüsselwort class

Das Schlüsselwort ist class. Der Rumpf enthält eine __init__-Methode, die jedes Mal läuft, wenn eine neue Instanz erstellt wird:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(3, 4)
print(p.x, p.y)

Ausgabe:

3 4

Point ist die Klasse; p ist eine Instanz davon. Die Klammern beim Aufruf Point(3, 4) rufen __init__ auf, das die Argumente Attributen der neuen Instanz zuweist. self ist der übliche Name für die Instanz; self.x setzt ein Attribut, das die übrigen Methoden der Instanz lesen werden.

2.20.2. Wann man eine Klasse verwendet

Greifen Sie zu einer Klasse, wenn diese Punkte gleichzeitig zutreffen:

  • Eine Handvoll zusammengehöriger Werte reist überall gemeinsam (das x und y eines Punktes; der Wert, die Einheit und der Zeitstempel einer Sensormessung).

  • Mehrere Funktionen nehmen dieselbe Menge an Werten entgegen und arbeiten mit ihnen.

  • Es ist nützlich, mehr als eines dieser Bündel gleichzeitig am Leben zu halten, getrennt voneinander.

Wenn die Daten einmalig sind, reicht meist ein einfaches dict oder tuple. Wenn Sie nur ein einzelnes Bündel von Konstanten benötigen, sind Variablen auf Modulebene in Ordnung. Klassen sind nicht der Standardcontainer – sie verdienen ihren Platz, wenn Zustand und Verhalten zusammenbleiben wollen.

2.20.3. Was __init__ tut

__init__ ist einfach eine reguläre Methode. Alles, was darin self zugewiesen wird, wird zu einem Attribut auf der neuen Instanz:

class Sensor:
    def __init__(self, name, unit):
        self.name = name
        self.unit = unit
        self.readings = []

temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)

Ausgabe:

temperature C []

readings wird auf eine leere Liste initialisiert – jede neue Instanz erhält ihre eigene Liste, keine gemeinsam genutzte. Alles, was nicht self zugewiesen wird, ist lokal zu __init__ und verschwindet, wenn es zurückkehrt.