301
10.8
Vererbung
allein die Methodendefinition der Unterklasse. Man sagt: Die Methodendefinition der Basis-
klasse wird überschrieben.
Abb. 10.8: Spezialisierungen der Klasse Geld
Anwendung und Probleme der Vererbung veranschaulichen wir nun an einem Beispiel. Es
handelt sich um eine Spezialisierung der Klasse
Geld, die ein Bankkonto modelliert. Diese
Klasse könnte den Kern eines (stark vereinfachten) Programms bilden, das die Konten einer
Bank verwaltet.
10.8.2 Beispiel: Die Klasse Konto – eine Spezialisierung der Klasse Geld
Auch ein Bankkonto stellt einen pekuniären Wert dar. Zur objektorientierten Modellierung
eines Kontos macht es daher Sinn, die Klasse
Konto von der Basisklasse Geld abzuleiten.
Wir verwenden hier die Variante aus Abschnitt 10.2 mit öffentlichen Attributen
betrag und
waehrung. Beachten Sie, dass das Skript keine einzige print-Anweisung enthält. Die Bild-
schirmausgabe ist keine Aufgabe dieser Klasse.
Skript:
# konto.py
import time
fro m gel d 2 imp o r t G e l d #1
class Konto(Geld):
""" Spezialisierung der Klasse Geld zur Verwaltung eines Kontos
Öffentliche Attribute:
geerbt: waehrung, betrag, wechselkurs
Öffentliche Methoden und Überladungen:
Geld
wechselkurs
betrag
waehrung
add()
getEuro()
Briefmarke
land
gestempelt
stempeln()
Scheck
bank
schecknummer
kontonummer
kontoinhaber
Konto
inhaber
kontoauszug
einzahlen()
auszahlen()
druckeKontoauszug()
Kapitel 10
Definition eigener Klassen
302
Erläuterung:
#1: Der Name der Basisklasse wird aus dem Modul geld2 importiert. Die Programm und
Datei
geld2.py muss im gleichen Verzeichnis sein wie die Programmdatei konto.py
anderenfalls müsste der Pfad spezifiziert werden.
#2: In der Initialisierungsprozedur wird zunächst die __init__()-Methode der Basisklasse
aufgerufen. Das Attribut
betrag (drittes Argument) repräsentiert den Kontostand und der
ist bei Eröffnung des Kontos null.
#3: Ein zusätzliches Attribut gegenüber der Basisklasse ist der Inhaber des Kontos.
geerbt: __add__(), __lt__(),
__le__(), __eq__(), getEuro()
überschrieben: __str__()
Erweiterungen:
einzahlen(), auszahlen(), druckeKontoauszug()
"" "
def __init__(self, waehrung, inhaber):
Geld.__init__(self,waehrung, 0) #2
self.__inhaber = inhaber #3
self.__kontoauszug = [str(self)] #4
def einzahlen(self,waehrung, betrag): #5
einzahlung = Geld(waehrung,betrag)
self.betrag =(self+einzahlung).betrag #6
eintrag = time.asctime()+' ' +str(einzahlung) +\
' neuer Kontostand: '+ self.waehrung + \
' ' + format(self.betrag, '.2f')
self.__kontoauszug += [eintrag] #7
def auszahlen(self, waehrung, betrag):
self.einzahlen(waehrung, -betrag)
def druckeKontoauszug(self): #8
for i in self.__kontoauszug:
p rin t ( i )
self.__kontoauszug = [str(self)]
de f _ _st r __(s e lf) : #9
return 'Konto von ' + self.__inhaber + \
':\nKontostand am ' + time.asctime() + \
': '+ format(self.betrag, '.2f') + \
+ ' ' + self.waehrung
303
10.8
Vererbung
#4: Der Kontoauszug ist eine Liste von Buchungseinträgen (Strings). Der erste Buchungs-
eintrag ist eine textuelle Beschreibung des Kontos, die von der Methode
__str__() geliefert
wird.
#5: Die Methode einzahlen() erhöht den Kontostand (Attribut self.betrag) um den ein-
gezahlten Geldwert.
#6: Diese Anweisung sollte man sich »auf der Zunge zergehen lassen«. Sie demonstriert,
wie man Überladungen von Operatoren nutzen kann, um kompakten Programmtext zu
schreiben. Das Objekt
self ist eine Instanz der Klasse Geld und repräsentiert den einge-
zahlten Geldbetrag,
self ist eine Instanz der Klasse Konto, die ja von Geld abgeleitet ist.
Somit wird bei der Auswertung des Terms
(self + einzahlung) die ererbte Methode
__add__() aus der Klasse Geld aufgerufen. Diese Methode liefert ein Objekt der Klasse
Geld (nicht etwa Konto!) mit der gleichen Währung wie self. Das Attribut betrag dieses
(neuen) Objektes
(self + einzahlung) enthält also den neuen Kontostand, nämlich die
Summe aus altem Kontostand und eingezahltem Betrag.
#7: Der Liste self.kontoauszug wird für diese Buchung ein neuer Eintrag hinzugefügt. Er
besteht aus einem Zeitstempel (Datum und Uhrzeit), der String-Repräsentation des einge-
zahlten Betrages und dem neuen Kontostand. Der Aufruf der Funktion
format() mit dem
zweiten Argument
'.2f' bewirkt, dass der Betrag als Gleitkommazahl mit zwei Nachkom-
mastellen dargestellt wird.
#8: Die Liste mit den Buchungseinträgen (Attribut kontoauszug) wird zurückgegeben,
anschließend wird sie gelöscht und als einziger Eintrag die String-Repräsentation des Kontos
eingefügt.
#9: Diese Methode überlädt die Standardfunktion str(). Sie liefert eine textuelle Beschrei-
bung des Kontos bestehend aus:
Name des Kontoinhabers
Kontostand
Zeitstempel (aktuelles Datum und Uhrzeit), der von der Funktion time.asctime()
mithilfe der Systemuhr geliefert wird. Das Modul time wurde in der allerersten Zeile
vor Beginn der Klassendefinition importiert.
Anwendung:
Wenn man die Definition der beiden Klassen
Geld und Konto im interaktiven Modus (z.B.
im Shell-Fenster von IDLE) eingibt, kann man sie anschließend durch direkte Eingabe eini-
ger Anweisungen testen.
Wir erzeugen ein Objekt der Klasse
Konto ...
... und führen einige Buchungen in unterschiedlichen Währungen durch:
>>> konto = Konto('EUR', 'Tim Wegner')
>>> konto.einzahlen('EUR', 1200)
>>> konto.auszahlen('USD', 50)
>>> konto.einzahlen('GBP', 30.30)

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.