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 auchdef __init__(self, x : float, y : float) -> None:
schreiben können. - Die Attribute
x
undy
haben wir mitself.x : float
undself.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
stattPoint
) falschen Typ angeben. Was besagt die Fehlermeldung? Was schliessen sie daraus?