Die Grammatik haben wir bisher als ein Dictionary dargestellt mit einer separaten Funktion zum Einlesen.
Das ist problematisch:
Abhilfe: Zusammenfassen von Daten und Methoden zu einer Klasse – ähnlich der bekannten String, Dictionary usf.
Bevor wir uns an die doch recht aufwändige Grammatik-Klasse machen, wollen wir zunächst nochmal überlegen, was eigentlich Klassen sind. Eine Klasse ist sozusagen eine Schablone für Objekte; letztere gehen durch instanzieren aus Klassen hervor. Die Klasse sagt, was ein Objekt kann (welche Methoden es hat), und sie bestimmt auch weitgehend, was die Identität des Objekts ausmacht (welche Daten nötig sind, um ihm die Identität zu geben). Die verschiedenen Objekte (man spricht auch gern von Instanzen der Klasse) haben dann konkrete Werte für diese Daten, haben aber alle das gleiche (durch die Klasse bestimmte) Verhalten. Diese konkreten Werte bezeichnet man auch gern als Zustand des Objekts. Eine schöne Art, diese Sachverhalte auszudrücken ist: “Objekte bestehen aus Zustand und Verhalten”.
Ein ganz einfaches Beispiel ist eine Klasse, die einfach eine Identität bekommt (hier einen Namen). Sie soll zunächst nicht mehr können als piepen und pupen.
class Tiny: def __init__(self, myName): self.myName = myName def beep(self): print self.myName, "beeps" def poop(self): print self.myName, "poops"
Wenn das in tiny.py gespeichert ist, kann man folgendes tun:
>>> from tiny import Tiny >>> t1, t2 = Tiny("Parrot"), Tiny("Rabbit") >>> t1.beep() Parrot beeps >>> t2.poop() Rabbit poops
Zumindest strengt dieses Spiel intellektuell nicht sonderlich an.
Was passiert hier?
Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen
(1)
Fügt der Klasse Tiny noch eine Methode getName hinzu, die den Namen der Instanz zurückgibt. Das sollte etwa so funktionieren:
>>> from tiny import Tiny >>> t1, t2 = Tiny("Parrot"), Tiny("Rabbit") >>> t1.getName() 'Parrot'
(2)
Die Plüschtiere, die Tiny modelliert, sollen jetzt nicht nur einen Namen haben, sondern auch noch satt und hungrig sein können. Am Anfang soll die Instanzenvariable hunger (die analog zu myName funktioniert) dabei Null sein, danach können die Methoden eat und wait den Hunger jeweils um eins reduzieren oder erhöhen. Verändert die beep-Methode, so dass sie, wenn das Plüschtier Hunger hat (also self.hunger>0 gilt), ihrer Ausgabe ein “Hungry” voranstellt.
(3)
Überlegt euch, wie ihr die Funktionalität der Klasse der letzten Aufgabe ohne Klassen hinbekommt, also nur mit Funktionen und Variablen, die zwischen ihnen hin- und hergeschoben werden.
(4)
Überlegt euch, was alles nötig wäre, um aus der Tiny-Klasse einen Tamagotchi zu bauen. Was davon könnt ihr schon, was nicht?