376
Neue Klassen definieren
Kapitel
14
Ein Klasse kann im Übrigen durchaus mehrere Unterklassen haben. So bil-
den zum Beispiel die Schoßhunde oder die Blindenhunde andere Unterklas-
sen der Klasse Hunde.
Eine ganz ähnliche Situation haben wir hier mit den
Turtle
-Objekten vor
uns. Wir brauchen welche, die mehr Botschaften verstehen oder mehr Me-
thoden beherrschen als gewöhnliche
Turtle
-Objekte. Um solche zu erhal-
ten, brauchen wir eine Unterklasse der Klasse
Turtle
. Und genau eine
solche wollen wir jetzt definieren.
Eine Unterklasse von Turtle
Aller Anfang ist schwer. Außer hier. Hier ist der Anfang leicht. Wir müssen
lernen, wie man eine Klasse definiert und wie man angibt, dass sie eine
Unterklasse einer bestimmten Klasse ist.
Unsere neue Klasse nennen wir
MyTurtle
. Sie soll eine Unterklasse von
Turtle
sein. Auch das können wir mit dem IPI untersuchen:
>
Schließe das Turtle-Grafik Fenster und mach mit!
>>> class MyTurtle(Turtle):
pass
Das war’s auch schon. Jetzt haben wir eine neue Klasse definiert. Sie ist
Unterklasse von
Turtle
, daher kennen alle Objekte von
MyTurtle
auto-
matisch alle Methoden von
Turtle
. Aber auch nicht mehr. Denn wir haben
uns bei der Definition von
MyTurtle
wirklich auf das Allernotwendigste
beschränkt, was in Python für eine zusammengesetzte Anweisung erforder-
lich ist: mit
pass
anzugeben, dass nichts weiter definiert wird. Sehen wir
nach, ob das funktioniert hat:
>>> fritz =
MyTurtle
()
>>> franz =
MyTurtle
()
>>> fritz.pencolor("red")
>>> fritz.forward(50)
>>> franz.left(90)
>>> franz.forward(50)
Funktioniert ja blendend! Wiederholen wir kurz: Was ist
MyTurtle
?
>>> MyTurtle
<class '__main__.MyTurtle'>
377
Eine Unterklasse von Turtle
MyTurtle
ist eine Klasse. Und
fritz
?
>>> fritz
<__main__.MyTurtle object at 0x014B60F0>
fritz
ist ein Objekt der Klasse
MyTurtle
. Python hat eine eingebaute
Funktion, mit der man nachprüfen kann, ob ein Objekt Instanz einer Klasse
ist:
>>> isinstance(fritz, MyTurtle)
True
Ja! Ist
fritz
auch Objekt der Klasse
Turtle
?
>>> isinstance(fritz, Turtle)
True
Ebenfalls. Warum? Weil
MyTurtle
eine Unterklasse von Turtle ist. (So wie
Cäsar ein Objekt der Klasse Jagdhunde ist, aber auch ein Objekt der Klasse
Hunde.)
So weit – so gut! Aber leider können
fritz
und
franz
noch nicht mehr
als jede gewöhnliche Turtle. Oder willst du etwa
fritz.jump(50)
auspro-
bieren? Woher soll denn
fritz
wissen, wie
jump(50)
geht?
Das wollen wir unseren neuen Turtles jetzt beibirngen. Das heißt, wir wol-
len die Definition der Klasse
MyTurtle
so treffen, dass Objekte dieser Klas-
se die Methoden
jump()
und
polyschritt()
kennen. Da diese Klassen-
definition aber schon etwas umfangreicher sein wird, erstellen wir sie nicht
im IPI, sondern in einer Datei, die wir aus
dynaspiralen_ arbeit.py
entwickeln:
>
Öffne ein Editorfenster mit
dynaspiralen_arbeit.py
.
>
Schreibe über die Definition der ersten Funktion die Zeile:
class MyTurtle(Turtle):
>
Um zu erreichen, dass die beiden folgenden Funktionsdefinitionen als
Methoden in die Klassendefinition übernommen werden, markiere
den Code der zwei Funktionen.
>
Wähle den Menüpunkt F
ORMAT
|I
NDENT REGION
oder drücke die
(ÿ)
-
Taste mit demselben Effekt.
>
Kommentiere alle Anweisungen unterhalb von
polyschritt()
aus
(Markieren und
(Alt)
+
(3)
):
378
Neue Klassen definieren
Kapitel
14
Die neue Klassendefinition für
MyTurtle
.
Die Einrückung der Funktionsdefinitionen macht diese zu Bestandteilen der
Klassendefinition von
MyTurtle
. Es verhält sich hier genauso wie bei allen
strukturierten Anweisungen von Python. Nur besteht hier der Körper der
Klassendefinition aus mehreren Funktionsdefinitionen, die wir jetzt Metho-
dendefinitionen nennen.
>
Speichere das Programm, das die neue Klassendefinition enthält, und
führe es aus. (Beachte:
dynaspiralen_arbeit.py
kann in dieser
Situation noch nicht voll funktionieren, da die Anweisungen, die das
Hauptprogramm bilden, noch nicht auf die neuen Verhältnisse mit der
Klassendefinition umgestellt sind. Da wir sie auskommentiert haben,
stört das im Moment nicht.)
>
Schließe, falls noch offen, das Turtle-Grafik-Fenster. Untersuche die
neue
MyTurtle
-Klasse mit dem IPI:
Zunächst erzeugen wir wieder zwei Objekte von
MyTurtle
. Der alte
fritz
und der alte
franz
haben leider die neuen Fähigkeiten nicht mitbekom-
men. Nur von jetzt an neu erzeugte Objekte bekommen sie:
>>> fritz = MyTurtle()
>>> franz = MyTurtle()
>>> fritz.pencolor("red")
>>> fritz.forward(50)
>>> franz.left(120)
>>> franz.forward(50)
Verlernt haben sie offenbar nichts! Und nun: Kennen sie die neuen Metho-
den?

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.