Aussehen
Klassen und Objekte
Ich sehe ein Pferd, dann noch ein Pferd, dann noch eins. Die Pferde sind nicht ganz gleich, aber es gibt etwas, das allen Pferden gemeinsam ist.
— Jostein Gaarder
Du willst ein Spiel bauen
Egal, welches Spiel du dir vornimmst — irgendwann stehen Figuren darin herum. In diesem hier sind es Pferde: Man versorgt sie, trainiert sie und reitet Rennen gegen die anderen. Vier Pferde stehen auf der Koppel, später sollen es zwanzig sein.
!Vier verschieden aussehende Pferde auf einer Koppel, jedes mit einem leeren Namensbalken über sich. Das Bild zeigt die Ausgangslage des Kapitels: viele Figuren, die sich im Einzelnen unterscheiden und trotzdem dasselbe können.](img/pferde.webp)
Jedes dieser Pferde hat eigene Werte — eine Farbe, ein Geschlecht, eine Geschwindigkeit. Und alle können dieselben Dinge: laufen und springen.
Mit dem, was du bisher hast, wird das erste Pferd zu drei Variablen:
python
fury_farbe = "schwarz"
fury_geschlecht = "weiblich"
fury_geschwindigkeit = 20Das zweite Pferd sind dieselben drei Zeilen noch einmal, nur mit anderen Namen davor:
python
nordwind_farbe = "braun"
nordwind_geschlecht = "männlich"
nordwind_geschwindigkeit = 25Bei zwanzig Pferden sind das sechzig Variablen, deren Namen du dir alle merken musst. Schlimmer wird es beim ersten Ändern: Sollen die Pferde auch ein Alter bekommen, schreibst du zwanzigmal dieselbe Zeile — und die eine, die du vergisst, findest du erst, wenn das Spiel abstürzt.
Eine Liste rettet dich nicht. In ["schwarz", "weiblich", 20] steht zwar alles beieinander, aber niemand sieht mehr, dass die 20 die Geschwindigkeit ist. pferd[2] sagt es dir auch nicht.
Was fehlt, ist ein Bauplan: einmal aufschreiben, was ein Pferd hat und was ein Pferd kann — und daraus danach beliebig viele einzelne Pferde herstellen, jedes mit eigenen Werten. Diesen Bauplan nennt man eine Klasse.
Ein Modell von etwas
Bevor du den Bauplan schreibst, musst du entscheiden, was überhaupt hineingehört. Ein echtes Pferd hat eine Fellfarbe, eine Lieblingsstelle zum Kraulen, eine bestimmte Anzahl Haare und einen Namen, den es nicht kennt. Dein Spiel braucht davon fast nichts.
Ein Programm bildet die Wirklichkeit nie vollständig ab, sondern immer nur so viel davon, wie es für seine Aufgabe braucht. Für das Rennen zählen Geschwindigkeit und Farbe — die Zahl der Haare interessiert niemanden.
Modell
Ein Modell ist eine vereinfachte Beschreibung eines realen oder gedachten Systems. Für eine bestimmte Zielsetzung wird es auf die wesentlichen Eigenschaften reduziert.

Ein Globus ist ein Modell der Erde. Er zeigt, wo die Kontinente liegen, und verschweigt alles andere. Genau das tust du gleich mit dem Pferd.
Der Stempel und die Abdrücke
Eine Klasse ist ein Stempel. Du schnitzt ihn einmal, und danach kannst du beliebig viele Abdrücke davon machen. Alle Abdrücke haben dieselbe Form — aber jeder liegt woanders auf dem Papier, jeder hat seine eigene Farbe, und wenn du einen davon durchstreichst, bleiben die anderen unversehrt.
Der Stempel ist die Klasse. Die Abdrücke sind die Objekte.

Klasse und Objekt
Ein Objekt ist ein einzelnes Ding — dieses eine Pferd auf der Koppel.
Eine Klasse ist die Vorlage für Objekte, die alle dieselben Attribute und dieselben Methoden haben. Sie beschreibt, was ein Pferd hat und was ein Pferd kann — nicht, wie ein bestimmtes Pferd heißt.
Was ein Objekt hat, heißt Attribut. Was ein Objekt kann, heißt Methode.
Karten auf Papier
Bevor eine Klasse in Python entsteht, zeichnet man sie meist auf. Eine Klassenkarte ist ein Kasten mit drei Fächern: oben der Name, in der Mitte die Attribute, unten die Methoden. Bei den Attributen steht nicht, welchen Wert sie haben, sondern welche Art von Wert dort erlaubt ist.

Ein einzelnes Objekt bekommt eine Karte, die fast genauso aussieht. Oben steht jetzt, wie dieses eine Objekt heißt und zu welcher Klasse es gehört, und in der Mitte stehen Werte statt Datenarten:

Aufgabe 1: Noch ein Pferd
Direkt über diesem Kasten steht die Objektkarte für nordwind. Zeichne auf Papier die Objektkarte für ein zweites Pferd, das du dir ausdenkst — eigener Name, eigene Werte.
Fertig bist du, wenn deine Karte dieselben Zeilen enthält wie die von nordwind und sich in jeder Zeile nur der Wert unterscheidet.
Aufgabe 2: Die Klassenkarte zum Onlineshop
Ein Onlineshop legt seine Waren als Objekte an. Jedes Produkt hat einen Namen, einen Preis und ein Haltbarkeitsdatum. Zwei Dinge kann ein Produkt: Es kann verkauft werden, und es kann verloren gehen. Die beiden Methoden heißen verkauft() und verloren().
Zeichne die Klassenkarte dazu — nicht die Karte eines einzelnen Produkts, sondern den Bauplan für alle.
Fertig bist du, wenn dein Kasten drei Fächer hat und in keinem Fach ein konkreter Preis steht.
Die erste Klasse
Genug gezeichnet. Das Pferd hebst du dir auf — das baust du später selbst. Hier steht die kleinstmögliche Klasse, an der sich alles zeigt:
python
class Hamster:
def __init__(self, name):
self.name = name
self.koerner = 0
def sammeln(self):
self.koerner = self.koerner + 1Drei Dinge sind neu, und alle drei sind schnell erklärt.
class gibt dem Stempel einen Namen. Klassennamen schreibt man groß — daran erkennst du im fremden Code sofort, dass eine Klasse gemeint ist und kein Wert.
__init__ ist eine besondere Methode. Sie wird beim Erzeugen eines Objekts automatisch aufgerufen und richtet es ein. Man nennt sie den Konstruktor. Die beiden Unterstriche links und rechts sind Pythons Art zu sagen: Diese Methode ruft man nicht selbst auf, die ruft sich schon.
self ist das Objekt selbst. Jede Methode bekommt es als ersten Parameter, und in der Methode ist es der Weg zu den eigenen Attributen. Ohne self wäre koerner nur eine gewöhnliche Variable, die am Ende der Methode wieder verschwindet. Mit self gehört sie dem Objekt und bleibt.
Objekte erzeugen und benutzen
Die Klasse allein tut noch nichts — sie liegt bereit, genau wie eine Funktion nach def. Erst der Aufruf des Klassennamens macht einen Abdruck:
python
kruemel = Hamster("Krümel")
nuss = Hamster("Nuss")
kruemel.sammeln()
kruemel.sammeln()
print(kruemel.koerner)
print(nuss.koerner)Zwei Objekte aus einem Stempel, und sie sind voneinander unabhängig: Krümel hat zwei Körner gesammelt, Nuss keins. Genau das war der Grund, warum du den Bauplan wolltest — jedes weitere Tier kostet dich eine einzige Zeile, und keinen einzigen neuen Variablennamen.

Beim Aufruf schreibst du kruemel.sammeln() ohne Argument, obwohl die Methode self verlangt. Das übernimmt Python: Was links vom Punkt steht, wird als self übergeben.
Punktnotation
Links vom Punkt steht das Objekt, rechts davon, was von ihm gemeint ist — ein Attribut oder eine Methode. kruemel.koerner ist ein Wert, kruemel.sammeln() ist eine Handlung; die Klammern machen den Unterschied.
Du kennst das schon: punkte.append(11) war nichts anderes. Eine Liste ist nämlich auch nur ein Objekt.
Aufgabe
Aufgabe
Der Standardwert im Konstruktor ist derselbe Handgriff, den du von Funktionen kennst.
Methoden, die rechnen
Methoden sind Funktionen, die einem Objekt gehören. Alles, was du über Funktionen weißt, gilt weiter — auch return:
python
class Taschenrechner:
def add(self, a, b):
return a + bAufgabe
Aufgabe
Aufgabe
In einer Methode darf natürlich auch eine Bedingung stehen.
Von der Karte zum Programm
Jetzt kommt das Pferd zurück. Was auf der Klassenkarte im mittleren Fach steht, wird im Konstruktor gesetzt; was im unteren Fach steht, wird eine Methode. Mehr ist der Weg von der Zeichnung zum Programm nicht.
Aufgabe
Kara wird ein Objekt
Auch Kara lässt sich als Objekt denken. Ein Marienkäfer hat einen Namen und weiß, wie weit er gelaufen ist — und er kann Dinge, die du ihm beibringst:
python
class Marienkaefer:
def __init__(self, name):
self.name = name
self.schritte = 0
def gehe(self, anzahl):
for i in range(anzahl):
move()
self.schritte = self.schritte + 1Der Unterschied zu einer gewöhnlichen Funktion gehe(n) ist der Zähler: Er gehört jetzt Kara und nicht dem Programm. Ein Objekt ist Verhalten und Gedächtnis in einem.
Aufgabe
Zurück auf die Koppel
Am Anfang stand die Koppel mit zwanzig Pferden. Ein Bauplan hast du jetzt — aber zwanzig Objekte in zwanzig Variablen wäre derselbe Ärger wie vorher. Dafür hast du das andere Werkzeug schon: die Liste für die Menge, die Klasse für das einzelne Ding.
Aufgabe