Klassen und Instanzen

Klassen? Was soll das denn heißen? Klassen kennst du sicherlich aus der Schule – aber das hat mit Objektklassen nichts zu tun.

Klasse oder »class« nennt man die Definition eines Objekts. Man kann auch sagen, in der Klassendefinition wird der Objekttyp beschrieben, die Objektklasse. Darin steht alles, was zum Objekt gehört: Sein Name, seine Eigenschaften (Objektvariablen) und seine Methoden (Objektfunktionen).

Nur wenn es eine genaue Beschreibung der Objektklasse gibt, kann man daraus ein konkretes Objekt erstellen und dann damit arbeiten. Das Objekt selber ist nun eine Instanz der Objektklasse.

[+]  Kuchen und Rezept

Klingt kompliziert? Noch mal einfacher ausgedrückt: Wenn du einen Kuchen backen willst, brauchst du ein Rezept. Das Rezept ist sozusagen die Definition des Kuchens, die Kuchenklasse, darin steht genau, welche Zutaten du brauchst und wie du daraus den Kuchen backen musst.

Das Rezept ist aber nicht der Kuchen. Das Rezept kannst du nicht essen. Erst wenn du auf der Grundlage des Rezepts einen Kuchen bäckst – oder zwei oder drei –, hast du die eigentlichen Objekte erstellt. Ohne Rezept kannst du keinen Kuchen backen, das ist die Grundlage. Aber um den Kuchen zu bekommen, musst du ihn erst mit dem Rezept herstellen.

Das Rezept ist hier die Objektdefinition (die Klasse), das Objekt (die Instanz) ist der Kuchen, den du damit herstellt. Aus einem Rezept kannst du beliebig viele Kuchen backen, und du kannst sie später auch verschieden verzieren, schneiden, verändern. Jeder Kuchen ist ein ganz eigenes Objekt, mit dem du hinterher ganz unterschiedliche Sachen machen kannst. Aber alle kommen aus derselben Klasse (sind mit demselben Rezept gebacken worden), der Klasse »Kuchen«. Verstanden?

Mit unserem Toasterobjekt ist es ganz ähnlich. Du kannst nur dann ein Toaster-Objekt erstellen, wenn es eine Definition gibt, woraus so ein Toaster genau besteht, welche Eigenschaften und welche Methoden er hat – das ist die Klasse Toaster, die dein Programm braucht, um zum Beispiel das Objekt mein_toaster zu erstellen, die Klassendefinition ist sozusagen die »Bauanleitung für einen Toaster«.

[+]  Zusammenfassung: Was ist eine Klasse?

Klassen sind Objektdefinitionen. In ihnen steht, wie das Objekt heißt, welche Eigenschaften (Objektvariablen) es hat und welche Fähigkeiten (Objektfunktionen oder Methoden). Die Objekte selber (die »Instanzen« einer Klasse) werden immer aus Klassen erstellt. Wenn ich ein Objekt aus einer Klasse erstelle, hat mein Objekt alle Eigenschaften und Fähigkeiten, die in der Klasse definiert worden sind.

Wie man so eine Klasse in Python selbst definiert, lernen wir sehr bald. Jetzt wollen wir aber erst einmal eine fertige Klasse benutzen und daraus ein Objekt machen.

Die Klasse Toaster habe ich bereits beschrieben. Die Attribute können genauso verwendet werden wie vorher im Text beschrieben. Die Klassendefinition muss allerdings vorhanden sein. Dafür habe ich das Modul toaster_class.py erstellt (ist bereits in TigerJython eingebaut), das du jetzt verwenden wirst.

Beginne also mit

from toaster_class import *

Dann startest du das Programm einmal mit dem grünen Pfeil. Es passiert natürlich nichts – aber Python hat jetzt die Objektdefinition (also die Klasse) für den Toaster importiert und kann sie verwenden.

Um jetzt ein eigenes Toaster-Objekt zu erstellen, musst du wissen, wie die Klasse heißt, mit der dein Objekt erstellt werden soll. In diesem Fall heißt sie einfach Toaster mit großem T.

[+]  Schreibweisen: Klassennamen, Methoden und Eigenschaften

Klassennamen sollten in Python immer mit einem Großbuchstaben beginnen. Eigenschaften (Objektvariablen) werden hingegen immer klein und bei mehreren Wörtern gerne mit Unterstrich geschrieben (snake_case), genauso wie normale Variablen. camelCase ist aber auch möglich. Objektmethoden ( = Funktionen eines Objekts) schreiben wir hier in TigerJython immer in camelCase, also klein, aber bei mehreren Wörtern beginnen die folgenden Wörter mit einem großen Buchstaben. Diese Schreibweisen sind keine Pflicht, aber sie entsprechen den üblichen Python- und TigerJython-Konventionen – es wird dadurch für andere leichter, den Code schnell zu verstehen.

mein_toaster = Toaster(schachtanzahl, farbe)

So erstellt man also ein Toaster-Objekt in Python.

Allgemein ausgedrückt:

objektname = Klassenname(evtl. Startwerte)

Als Startwerte braucht dieser Toaster zum einen die Anzahl der Toastschächte (wie viele Toasts passen rein) und außerdem die Farbe. Andere Objekte können oft auch ohne Startwerte erstellt werden, da würde die Klammer einfach leer bleiben.

Also gut: Öffne die Konsole, und schreibe folgenden Befehl hinein:

mein_toaster = Toaster(2,"rot")

Fertig. Jetzt hast du ein Objekt der Klasse Toaster erstellt. Dein Objekt heißt mein_toaster. Seine Startwerte der Eigenschaften sind: 2 Schächte, Farbe; »rot«.

Jetzt kannst du damit etwas machen. Zum Beispiel den Zeitregler auf 30 Sekunden stellen. Gib alle folgenden Befehle zum Testen einfach in der Konsole ein:

mein_toaster.toast_zeit = 20

Willst du wissen, wie der aktuelle Zustand deines Toasters ist? Dafür hat unser Objekt auch eine eigene eingebaute Funktion (Methode). Die wird automatisch ausgeführt, wenn du einfach das Objekt mit dem print-Befehl ausgibst.

print mein_toaster

Das führt zu folgender Ausgabe:

Farbe des Toasters: rot
Toastschächte: 2
Eingestellte Zeit: 20 Sekunden
Toasts im Toaster: 0
Zustand der Toasts: ungetoastet

Nun kannst du deinen Toaster in Gang setzen, erstmal 2 Toasts rein:

mein_toaster.toastReintun(2)

Wenn du denselben Befehl danach noch einmal versuchst, kommt folgende Ausgabe:

Es ist nicht mehr genügend Platz dafür!

Klar, denn der Toaster ist voll, wenn schon 2 Toasts drin sind. Das Objekt denkt mit!

Nun wird getoastet:

print mein_toaster.toasten()

Der print-Befehl steht dabei, weil wir die Rückmeldung der Toastfunktion auch gleich mit anzeigen wollen:

20 Sekunden vergangen, Toasten erledigt, das Brot ist stark getoastet.

Nun noch mal den Zustand des Toasters ausgeben:

print mein_toaster

Die Ausgabe lautet jetzt so:

Farbe des Toasters: rot
Toastschächte: 2
Eingestellte Zeit: 20 Sekunden
Toasts im Toaster: 2
Zustand der Toasts: stark getoastet
Der Zustand unseres Toaster-Objekts

Abbildung 15.1    Der Zustand unseres Toaster-Objekts

Okay – fertig getoastet. Jetzt können die Toastscheiben raus:

print mein_toaster.toastAuswerfen()

Das ergibt:

2 mal Toast ausgeworfen. Zustand: stark getoastet

Toll! Jetzt hast du also ein eigenes Toasterobjekt ins Leben gerufen und sinnvoll verwendet! Natürlich muss es nicht bei einem bleiben. Du kannst jetzt jederzeit auch weitere Toasterobjekte erstellen, die ihr ganz eigenes Leben haben.

Mit

grosser_toaster = Toaster(4,"schwarz")

erstellst du ganz einfach ein zweites Toaster-Objekt. Das ist vollkommen unabhängig vom ersten, auf das du nach wie vor auch noch zugreifen kannst. Weil es ein großer Toaster sein soll, setzt du einfach die Anzahl seiner Schächte bei der Erstellung auf 4. Seine Farbe soll schwarz sein.

In diesen Toaster kannst du jetzt 2 Brote hineinstecken und danach noch mal 2, ohne dass er sich beschwert, denn er hat ja mehr Platz.

print grosser_toaster

Farbe des Toasters: schwarz
Toastschächte: 4
Eingestellte Zeit: 10 Sekunden
Toasts im Toaster: 0
Zustand der Toasts: ungetoastet