Vererbung kennst du aus Bio (Stammbaum der Artverwandschaften) oder aus dem
täglichen Leben (dein Stammbaum). Und diese Idee der Vererbung kann man fürs
Programmieren nutzen! Grundlegend für die Vererbung ist die Eltern-Kind-Relation: 'irgendwie' werden Eigenschaften von den Eltern auf das Kind
vererbt. Was könnte man beim Programmieren vererben? Ganz einfach: Eine Klasse
besteht aus Methoden und Eigenschaften, und die können vererbt werden! An
dieser Stelle die zentrale Frage: Welche Eigenschaften gibt es in der Klasse
Bankkonto
(siehe bank.py)?
______________________________________________________
Und welche Methoden stellt die Klasse Bankkonto
zur Verfügung?
______________________________________________________
______________________________________________________
______________________________________________________
In Python funktioniert Vererbung so: Eine Klasse kann mehrere Kinder haben, man sagt hier Subklassen, und eine Subklasse kann mehrere Eltern haben! Die Elternklasse(n) nennt man auch Superklasse(n), manche sprechen an dieser Stelle auch gerne von Vorgänger und Nachfolger. Und wie sagt man Python, dass eine Klasse eine andere beerben soll? So:
class Taschengeld(Bankkonto):
Du siehst: unsere Bankkonto-Klasse (Elternklasse!) kommt hinter dem Namen der Kindklasse in Klammern, schauen wir uns ein Beispiel an . . .
class Taschengeld(Bankkonto):
"""Taschengeld-Konto: man darf nicht überziehen . . ."""
def __init__(self,startbetrag):
"""Konstruktor: erzeugt Taschengeldkonto"""
# rufe Konstruktor aus Bankkonto-Klasse auf
Bankkonto.__init__(self,startbetrag)
def auszahlung(self, betrag):
if ((self.kontostand - betrag) < 0.0):
print( "ERROR!! DU darfst nicht ueberziehen! ERROR!!" )
else:
self.kontostand = self.kontostand - betrag
Beachte die Einrückungen! Zur Erklärung:
class Taschengeld(Bankkonto):
Hier beginnt die Klassenvereinbarung, der Name der Elternklasse wird "einfach" als Parameter übergeben! __init__
. Der Konstruktor ruft wiederum den Konstruktor der Elternklasse auf: Bankkonto.__init__(self,startbetrag)
. In diesem Zusammenhang: Was bedeutet eigentlich self
?auszahlung(self,betrag)
gibt es auch in der Elternklasse (schau nach), da man aber bei einem Taschengeld-Konto nicht überziehen darf, müssen wir diese Methode verändern, man sagt: wir überschreiben die Methode auszahlung
der Elternklasse. Frage: Was ist mit den anderen Methoden, können wir sie benutzen? Wie? Fehlermeldungen gibt es beim Ausführen von taschengeld.py
desöfteren, Beispiel:
Traceback (most recent call last):
File "C:\py_prg\oops_intro\bankkonto_python\taschengeld.py", line 6, in ?
class Taschengeld(Bankkonto):
NameError: name 'Bankkonto' is not defined
Überlege, wie du diesen Fehler vermeiden kannst . . .
UML steht fur Unified Modeling Language, zu Deutsch etwa eine
Beschreibungssprache fur Klassen (sehr frei ubersetzt!). Beispiel:
Bankkonto |
self.kontostand |
constructor Bankkonto(startbetrag) method einzahlung(betrag) auszahlung(betrag) anzeigen() |
Klassen (und Objekte) werden in UML durch Rechtecke dargestellt:
in der ersten Zeile steht der Name der Klasse, hier also Bankkonto
,
in der zweiten Zeile werden die Eigenschaften aufgezählt, und da es in unserer Klasse nur
eine Variable kontostand
gibt, steht hier auch nur eine Eigenschaft.
In der dritten Zeile finden wir die Methoden (oder Funktionen) der Klasse
Bankkonto: einzahlung
, auszahlung
und anzeigen
, sowie den Konstruktor.
In UML kann man auch Vererbung und das Überschreiben von Methoden darstellen,
wobei links jeweils die Superklassen und rechts die Unterklassen stehen:
|
← |
|
____________________________________________________
findest du unter dem Link Beispiele:
Dispokonto
und überlege, welche Methoden du überschreiben musst. Kannst du Methoden unverändert übernehmen? Welche? Brauchst du neue Eigenschaften? Welche? (abspeichern unter dispo.py
) self.inhaber
Dispokonto
, ergänzt um den Kontoinhaber und stelle sie als UML-Diagramm dar! DirList
(dirlist.py). DirList |
self.DirListe self.DirMax |
constructor DirList() method listLength() addEntry(element) swapFirst(element) delEntry(element) printList() resetList() |
swapFirst
. Aufgabe dieser Methode: sie setzt den Parameter
"element" an den Anfang der DirListe
(Hilfe gibt es hier:
gfsqlite).→ sp, 2023-07-26