371
14
Neue Klassen definieren
In diesem Kapitel lernst du endlich, was du alles brauchst, um deine eige-
nen Klassen zu definieren und damit zu selbst entworfenen Objekten zu
kommen.
Dabei wirst du …
$
zunächst von unseren Turtles ausgehen und aus ihnen eine neue Klasse
von »verbesserten« Turtles ableiten.
$
sehen, wie die neuen Turtles eingesetzt werden können.
$
eine ganz sonderbare Klasse
Bote
mit allen möglichen Variationen bis
hin zu Agenten erstellen.
372
Neue Klassen definieren
Kapitel
14
Turtles, die mehr können!
Im Kapitel 11 mussten wir bei der Programmierung von Dynaspiralen
berücksichtigen, dass die
Turtle
-Objekte, die uns die Spiralen gezeichnet
haben, unsere Bibliotheks-Funktion
jump()
nicht (als Methode) kennen.
Daher mussten wir auf die Methoden
penup()
,
forward()
,
pendown()
zurückgreifen:
Die Funktion
jump()
funktioniert – wie alle anderen Turtle-Grafik-Funk-
tionen, die wir bisher programmiert haben – nur mit der namenlosen Turtle,
die wir mit der Importanweisung
from turtle import *
zur Verfügung
gestellt bekommen.
Wenn man mehrere Turtles benutzt, muss man jede Turtle-Grafik-Anwei-
sung an eine bestimmte von ihnen schicken – mit unserer nun schon
bekannten Punktnotation.
Turtles haben kein
e
Methode
jump()
.
373
Turtles, die mehr können!
Genauer: Der Code von
jump()
sieht (etwas vereinfacht) so aus:
def jump(laenge):
penup()
forward(laenge)
pendown()
Als wir in Kapitel 11 wollten, dass mehrere Turtles einen Sprung ausführen,
mussten wir schreiben:
for krot in kroeten:
krot.penup()
krot.forward(laenge)
krot.pendown()
Schöner wäre gewesen:
for krot in kroeten:
krot.jump(50)
Das ging aber nicht, da
Turtle
-Objekte keine Methode
jump()
haben! Ein
Mangel! Du kannst dir denken, dass sich der für Funktionen, die aus mehr
Anweisungen als
jump()
bestehen, noch unangenehmer auswirkt.
Wir wollen uns nun eine erste Möglichkeit schaffen, beim Aufruf von
jump()
eine Turtle (das heißt: ein
Turtle
-Objekt) anzugeben, die den
Sprung ausführen soll.
jump()
braucht also eine zusätzliche Information. Wie übergibt man eine
Information an eine Funktion? Als Argument! Es ist daher eine nahe liegen-
de Idee, für das
Turtle
-Objekt, das zeichnen soll, einen neuen Parameter
einzuführen:
def jump(turtle, laenge):
turtle.penup()
turtle.forward(laenge)
turtle.pendown()
Probieren wir das gleich aus:
>
Mach mit:
>>> from turtle import Turtle
>>> alex = Turtle()
>>> bert = Turtle()
>>> bert.left(90)
374
Neue Klassen definieren
Kapitel
14
>>> bert.pencolor("red")
>>> def jump(turtle, laenge):
turtle.penup()
turtle.forward(laenge)
turtle.pendown()
>>> for krot in (alex, bert):
jump(krot, 50)
Ah, das funktioniert! Mutig geworden, fassen wir den »Drehschritt«, vor-
wärts/links, den die Turtles wiederholt für ihre Spiralen machen müssen,
auch in eine kleine Funktion:
>>> def polyschritt(turtle, laenge, winkel):
turtle.forward(laenge)
turte.left(winkel)
>>> for laenge in range(80, 20, -5):
for krot in [alex, bert]:
polyschritt(krot, laenge, 120)
Sehr ermutigend! Das bauen wir nun
gleich in das Dynaspiralen-Pro-
gramm ein.
>
Schließe das Turtle-Grafik-Fenster. Öffne von der IDLE aus
dynaspiralen_arbeit_.py
.im Verzeichnis
kap14
und speichere
es als
dynaspiralen_arbeit.py
>
Füge gleich nach der
import
-Anweisung den Code der oben erprob-
ten Funktionen
jump()
und
polyschritt()
ein.
>
Ändere die Anweisungsblöcke der beiden
for
-Schleifen so ab, dass
darin diese neuen Funktionen benutzt werden:
for krot in kroeten:
krot.hideturtle()
krot.speed(0)
jump(krot, 50)
375
Turtles, die mehr können!
krot.pensize(3)
krot.right(30)
for laenge in range(80, 20, -5):
for krot in kroeten:
polyschritt(krot, laenge, 120)
>
Speichere das Programm und führe es aus. Es sollte dasselbe Ergebnis
liefern wie vor der Änderung.
>
Speichere eine Kopie des Programms als
dynaspiralen02.py
ab.
Vielleicht empfindest du so wie ich, dass das Programm einheitlicher und
schöner wäre, wenn der Code so lautete:
for krot in kroeten:
krot.hideturtle()
krot.speed(0)
krot.jump(50)
krot.pensize(3)
krot.right(30)
for laenge in range(100,0,-5):
for krot in kroeten:
krot.polyschritt(laenge, 120)
Was verlangen wir damit? Wir verlangen, dass die Turtles
alex
,
bert
,
carl
und
dinu
Botschaften verstehen sollen, die
Turtle
-Objekte eigent-
lich gar nicht verstehen:
jump()
und zum Beispiel
polyschritt()
. Wir
wollen aber auch, dass sie alle Botschaften, die
Turtle
-Objekte verstehen,
weiterhin verstehen. Du kannst das auch so formulieren: Sie sollen, im Ver-
gleich zu gewöhnlichen
Turtle
-Objekten, über zusätzliche Methoden
verfügen.
Denken wir an die kurz erwähnten Hunde Bello und Waldi aus Kapitel 11
zurück – gewöhnliche Hunde, zumindest wissen wir nicht mehr über sie.
Wir sagten, Bello und Waldi sind Objekte der Klasse Hund.
Vielleicht kennst du auch einen Jäger mit einem Jagdhund, Cäsar. Jagdhun-
de verstehen einige Anweisungen, die gewöhnliche Hunde nicht verstehen.
Jagdhunde bilden ebenfalls eine Klasse. Cäsar ist ein Objekt dieser Klasse.
Weil aber natürlich jeder Jagdhund auch ein Hund ist, sagen wir: Die Jagd-
hunde bilden eine Unterklasse der Hunde. Sie haben alle Eigenschaften und
Fähigkeiten, die zu Hunden gehören – wir sagen: Sie erben alle Fähigkeiten
und Eigenschaften der Klasse Hund. Und sie haben noch zusätzliche.

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.