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
xundyhaben wir mitself.x : floatundself.y : floatannotiert. Da wir Parameter der__init__Methode bereits mit: floatannotiert 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
PntstattPoint) falschen Typ angeben. Was besagt die Fehlermeldung? Was schliessen sie daraus?