Wofür stehen die Parameter in __init__(self, ...) und super().__init__(...) in Python?

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.

Ruhrpotter4324 
Fragesteller
 22.09.2021, 08:36

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:

class AllgemeinesKonto(VerwalteterGeldbetrag):
    def __init__(self, kundendaten, kontostand):
        super().__init__(kontostand)
        self.Kundendaten = kundendaten
    def geldtransfer(self, ziel, betrag):
        if self.auszahlenMoeglich(betrag) and ziel.einzahlenMoeglich(betrag):
            self.auszahlen(betrag)
            ziel.einzahlen(betrag)
            return True
        else: 
            return False
    def zeige(self):
        self.Kundendaten.zeige()
        VerwalteterGeldbetrag.zeige(self)
0
daCypher  22.09.2021, 09:12
@Ruhrpotter4324

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.

1

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.

Woher ich das weiß:eigene Erfahrung