Wofür stehen die Parameter in __init__(self, ...) und super().__init__(...) in Python?
Hallo, ich lese mir in einem Buch gerade das Kapitel zu Klassen und Vererbung durch. Was ich bislang verstanden habe: Basisklassen kann man durch Tochterklassen im Stil Tochterklasse(Basisklasse) kopieren und anschliessend weiterentwickeln (Vererbung).
Dabei gibt man der Tochterklasse mit __init__(self, ...) ihren eigenen Konstruktor und damit der Codeverlauf konsistent bleibt, fügt man in der anschliessenden Zeile super().__init__( ...) hinzu. Anschliessend kann man Methoden der Basisklasse überschreiben. Bei einfachen Beispielen fand ich das nachvollziehbar.
Nun habe ich ein komplizierteres Beispiel vor, bei dem in den jeweiligen Klammern noch weitere Parameter stehen (sowohl bei dem neuen als auch alten Konstruktor), das sieht wie folgt aus:
#Tochterklasse der Basisklasse VerwalteterGeldbetrag
class AllgemeinesKonto(VerwalteterGeldbetrag):
def __init__(self, kundendaten, kontostand):
super().__init__(kontostand)
self.Kundendaten = kundendaten
Frage: Wofür genau stehen Werte wie diese in den Klammern, was machen sie? Gemeint sind die ab def. Da der Gesamtcode über 80 Zeilen oder so lang ist, habe ich nur diese beiden Inhalte eingefügt, um die Frage abstrakt zu halten. Was objektorientierte Programmierung ist, habe ich grob verstanden, nur sind da so viele Schritte, auf die ich als kompletter Anfänger nicht so schnell kommen würde.
2 Antworten
class AllgemeinesKonto(VerwalteterGeldbetrag):
Erstelle eine Klasse mit dem Namen "AllgemeinesKonto", die von "VerwalteterGeldbetrag" erbt, also alle Variablen und Funktionen, die in Verwalteter Geldbetrag definiert sind, sind auch in AllgemeinesKonto definiert
def __init__(self, kundendaten, kontostand):
Definiere die Initialisierungsfunktion für "AllgemeinesKonto". Das wird ausgeführt, wenn ein neues Objekt vom Typ AllgemeinesKonto erzeugt wird. "self" ist eine Referenz auf das neu erzeugte Objekt. Damit kannst du dann Variablen einstellen, die nur für das neue Objekt gelten.
super().__init__(kontostand)
Rufe die Initialisierungsroutine der übergeordneten Klasse (also von VerwalteterGeldbetrag) auf. Dort muss also __init__(self, kontostand) definiert sein.
self.Kundendaten = kundendaten
Erstelle für das AllgemeinesKonto-Objekt eine Variable namens Kundendaten mit dem Wert, der im Parameter kundendaten übergeben wurde.
In deinem Beispiel ist es so, dass die übergeordnete Klasse den Kontostand verwaltet. Die Funktionen "auszahlenMoeglich", "einzahlenMoeglich", "auszahlen" und "einzahlen" sind in der Klasse VerwalteterGeldbetrag definiert und werden von AllgemeinesKonto geerbt. Für die Funktionen wird aber ein Kontostand benötigt.
Vermutlich wird die Klasse VerwalteterGeldbetrag den Kontostand auch einfach nur in eine Variable speichern. Vielleicht passieren aber auch irgendwelche Prüfungen, z.B. dass man kein Konto mit einem negativen Betrag eröffnen darf oder dass der Kontostand in einer privaten Variable gespeichert wird, damit er von außen nicht einfach verändert werden kann. Damit du den Teil in AllgemeinesKonto nicht nachbauen musst, wird der Kontostand halt über die init-Funktion von VerwalteterGeldbetrag verwaltet.
Python sprech ich nicht aber die „Werte" in den Klammern sind Initalisierungsdaten, die dem Konstruktor übergeben werden. Sehe dir den Konstruktor an.
Denke objektorientiert: Alles ist Objekt also auch das „self", „Kundendaten" und „Kontostand".
Das ist unabhägig vom Pythonsystem.
Vielen Dank für die ausführliche Erklärung! Welchen Zweck hat es denn, dass bei super().__init__(kontostand) diese "Initialisierungsroutine" aufgerufen wird? Mir ist bei dem mir vorliegenden Beispielprogramm aufgefallen, dass immer wenn super().__init__ ()aufgerufen wird, die in den Klammern stehende Initialisierungsdatei in der jeweiligen Klasse danach keinerlei Rolle mehr spielt, in diesem Fall kontostand. Stattdessen werden dann zB Attribute aus den restlichen relevanten Initialisierungsdaten aus der Methode __init__(self, ...) erzeugt und in Methoden verarbeitet. Hat super().__init__() innerhalb der Klasse also eine ausklammernde Funktion für die Initialisierungsdatei, die in den Klammern steht?
Sorry falls die Frage irgendwie "dumm" ist, ich lese mich erst seit heute zu dem Thema ein.
Beispiel: