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.
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.