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.

Klassendiagramm

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.

X

Fehler melden

X

Suche