Exkurs - Implementierung in Python

Deklaration einer Klasse

Am Beispiel der Klassen Stapel und Kartenstapel 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 eine Implementierung dieser Klassen in Python, bei der wir der Übersichtlichkeit halber die Kommentierung weggelassen haben:

#-----------------------------------------------------------
# Stapel
#-----------------------------------------------------------

class Stapel(object):

    __slots__ = ('liste')
    
    def __init__(self, pListe = []):
        self.liste = pListe

    def isEmpty(self):
        if self.liste == []:
            return True
        else:
            return False

    def push(self, element):
        self.liste = self.liste + [element]

    def pop(self):
        if not self.isEmpty():
            oberstesElement = self.liste[len(self.liste)-1]
            self.liste = self.liste[:len(self.liste)-1]
            return oberstesElement
        else:
            return None

    def top(self):
        if not self.isEmpty():
            return self.liste[len(self.liste)-1]      

    def setStapel(self, pListe):
        self.liste = pListe

    def getStapel(self):
        return self.liste

#-----------------------------------------------------------
# Kartenstapel
#-----------------------------------------------------------

from random import randint

class Kartenstapel(Stapel):

    def __init__(self):
        self.liste = [
            'X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7',
            'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7',
            'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7',
            'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7'
            ]

    def mischen(self):
        neueListe = []
        aktuelleAnzahl = len(self.liste)
        while aktuelleAnzahl > 0:
            i = randint(0, aktuelleAnzahl-1)
            neueListe = neueListe + [self.liste[i]]
            del self.liste[i]
            aktuelleAnzahl = len(self.liste)
        self.liste = neueListe

Die Vererbungsbeziehung wird durch die Deklaration class Kartenstapel(Stapel) festgelegt. Hier wird die Basisklasse in Klammern angegeben. Wenn keine Vererbungsbeziehung festgelegt werden soll, dann wird - wie im Beispiel class Stapel(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 verschiedene Wege gehen.

Eine Möglichkeit besteht darin, die Definition der Methode neu zu erstellen:

class Kartenstapel(Stapel):

    def __init__(self):
        self.liste = [
            'X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7',
            'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7',
            'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7',
            'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7'
            ]

Hier wird die Methode __init__ abweichend von der Implementierung in der Basisklasse neu implementiert.

Beim Überschreiben ist es erlaubt, die entsprechende Methode der Basisklasse zu nutzen:

class Kartenstapel(Stapel):

    def __init__(self):
        Stapel.__init__(self,
                        ['X-A', 'X-K', 'X-D', 'X-B', 'X-10', 'X-9', 'X-8', 'X-7',
                         'P-A', 'P-K', 'P-D', 'P-B', 'P-10', 'P-9', 'P-8', 'P-7',
                         'H-A', 'H-K', 'H-D', 'H-B', 'H-10', 'H-9', 'H-8', 'H-7',
                         'K-A', 'K-K', 'K-D', 'K-B', 'K-10', 'K-9', 'K-8', 'K-7'])

Hier wird mit der Anweisung Stapel.__init__(...) der Konstruktor der Basisklasse Stapel aktiviert.

X

Fehler melden

X

Suche