Skip to main content

Typannotationen für Klassen

Auch für die Lesbarkeit von Code, der in Klassen organisiert ist, sind Typannotationen hilfreich. In diesem Bereich gibt es kaum Überraschungen: Für Methoden verwenden wir die gleiche Syntax wie für Funktionen, und für Attribute verwenden wir die gleiche Syntax wie für Variablen.

Das nachfolgende Beispiel sollte genügen, damit Sie das Prinzip verstehen:

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

def translate(self, dx : float, dy : float) -> None:
self.x = self.x + dx
self.y = self.y + dy

Hier noch einige Anmerkungen zum Beispiel:

  • Den Rückgabewert der initialisierenden Methode __init__ haben wir nicht annotiert. __init__ gibt nie etwas zurück und dies ist für alle Python Programmier*innen klar. Wir hätten aber auch def __init__(self, x : float, y : float) -> None: schreiben können.
  • Die Attribute x und y haben wir mit self.x : float und self.y : float annotiert. Da wir Parameter der __init__ Methode bereits mit : float annotiert haben, bringt dies nicht viel Mehrwert. Wir haben dies aber trotzdem gemacht, um zu zeigen, dass wir dies auch tun können.

Typ einer Instanz der Klasse

Wir haben bereits besprochen, dass der Zweck von Klassen ist, eigene Datentypen zu definieren. Objekte (oder Instanzen) der Klasse sind dann Werte dieses Datentyps. Entsprechend können wir den Namen der Klasse als Typ in der Typannotation verwenden, wie im folgenden Beispiel gezeigt:

p : Point = Point(1.0, 2.0)

Sie können im nachfolgenden Trinket mit dem Code experimentieren:

  • Da Python die Typen zur Laufzeit nicht prüft, könnten Sie auf die Idee kommen, dass diese von Python einfach ignoriert werden. Stellen Sie sicher, dass dies nicht so ist, indem Sie beim Erzeugen der Instanz den Namen des Typs in der Annotation falsch schreiben (z.b Pnt statt Point) falschen Typ angeben. Was besagt die Fehlermeldung? Was schliessen sie daraus?