Exkurs - Implementierung in Python
Deklaration einer Klasse
Am Beispiel der Ampel-Klassen sollen die Besonderheiten aufgezeigt werden, die man bei der Implementierung von Vererbung in Python beachten muss.
Ausgangspunkt ist das folgende Klassendiagramm, das die Vererbungsbeziehung der beiden Klassen beschreibt.
Hier (noch einmal) eine Implementierung dieser Klassen in Python:
class Ampel(object):
def __init__(self, pListeZustaende):
self.listeZustaende = pListeZustaende
self.indexAktuellerZustand = 0
def schalten(self):
if self.indexAktuellerZustand < len(self.listeZustaende)-1:
self.indexAktuellerZustand = self.indexAktuellerZustand + 1
else:
self.indexAktuellerZustand = 0
def getZustand(self):
return self.listeZustaende[self.indexAktuellerZustand]
def setZustand(self, z):
self.indexAktuellerZustand = self.listeZustaende.index(z)
class AmpelAuto(Ampel):
def __init__(self, anfangszustand):
self.listeZustaende = ['rot', 'rotgelb', 'gruen', 'gelb']
self.indexAktuellerZustand = self.listeZustaende.index(anfangszustand)
def getLampen(self):
zustand = self.listeZustaende[self.indexAktuellerZustand]
if zustand == 'rot':
lampen = (True, False, False)
elif zustand == 'rotgelb':
lampen = (True, True, False)
elif zustand == 'gruen':
lampen = (False, False, True)
elif zustand == 'gelb':
lampen = (False, True, False)
return lampen
Die Vererbungsbeziehung wird durch die Deklaration AmpelAuto(Ampel)
festgelegt.
Hier wird die Basisklasse in Klammern angegeben. Wenn keine Vererbungsbeziehung festgelegt werden soll, dann
wird - wie im Beispiel class Ampel(object)
- als Basisklasse object
angegeben.
Übernommene Attribute und Methoden werden in der Deklaration der Subklasse nicht aufgeführt. Ergänzende Attribute und Methoden werden wie üblich deklariert. Beim Überschreiben von Methoden kann man oft verschiedene Wege gehen.
Eine Möglichkeit besteht darin, die Definition der Methode neu zu erstellen:
class Ampel(object):
def __init__(self, pListeZustaende):
self.listeZustaende = pListeZustaende
self.indexAktuellerZustand = 0
...
class AmpelAuto(Ampel):
def __init__(self, anfangszustand):
self.listeZustaende = ['rot', 'rotgelb', 'gruen', 'gelb']
self.indexAktuellerZustand = self.listeZustaende.index(anfangszustand)
...
Oft kann man beim Überschreiben aber auch die entsprechende Methode der Basisklasse nutzen:
class Ampel(object):
def __init__(self, pListeZustaende):
self.listeZustaende = pListeZustaende
self.indexAktuellerZustand = 0
...
class AmpelAuto(Ampel):
def __init__(self, anfangszustand):
Ampel.__init__(self, ['rot', 'rotgelb', 'gruen', 'gelb'])
self.indexAktuellerZustand = self.listeZustaende.index(anfangszustand)
...
Hier wird mit der Anweisung Ampel.__init__(self, ['rot', 'rotgelb', 'gruen', 'gelb'])
die Konstruktormethode __init__(...)
der Basisklasse Ampel
aktiviert.