Kurze Antwort
super(DerivedClass, self).__init__()
Lange Antwort
Was macht super()
?
Es nimmt den angegebenen Klassennamen, sucht nach seinen Basisklassen (Python erlaubt Mehrfachvererbung) und sucht nach der Methode (__init__
in diesem Fall) in jeder von ihnen von links nach rechts. Sobald es die verfügbare Methode findet, wird sie aufgerufen und die Suche beendet.
Wie rufe ich init aller Basisklassen auf?
Oben funktioniert es, wenn Sie nur eine Basisklasse haben. Aber Python erlaubt Mehrfachvererbung und Sie möchten sicherstellen, dass alle Basisklassen ordnungsgemäß initialisiert werden. Um dies zu tun, sollte jede Basisklasse init aufrufen:
class Base1:
def __init__(self):
super(Base1, self).__init__()
class Base2:
def __init__(self):
super(Base2, self).__init__()
class Derived(Base1, Base2):
def __init__(self):
super(Derived, self).__init__()
Was passiert, wenn ich vergesse, init für super aufzurufen?
Der Konstruktor (__new__
) wird in einer Kette aufgerufen (wie in C++ und Java). Sobald die Instanz erstellt ist, wird nur der Initialisierer dieser Instanz (__init__
) aufgerufen, ohne eine implizite Kette zu ihrer Superklasse.
1 Stimmen
Sie sollten betonen, dass Sie eine Antwort möchten, die den abgeleiteten Klassennamen nicht verwendet. z.B. (Pseudocode):
super().__init__(args...)
1 Stimmen
Du solltest Aidan Gomez Antwort akzeptieren. Es würde uns viel Zeit sparen, da sie eine Antwort sowohl in Python 2 als auch in 3 hat.
1 Stimmen
Python 2 wird nicht mehr offiziell unterstützt. Auch seine Antwort kam 5 Jahre später.
1 Stimmen
@Mike Ich denke, es gibt immer noch Wert in einer Antwort, die den Python 2 Weg auflistet, denn es gibt noch viel alten Python 2 Code da draußen, und einige der Leute, die auf diese Frage stoßen, werden wahrscheinlich sonst nicht wissen, wie sie damit umgehen sollen. (Und trotz des Endes der Lebensdauer schreiben viele Leute tatsächlich immer noch Code in Python 2, entweder weil sie es nicht besser wissen oder weil es ihnen von organisatorischen Anforderungen auferlegt wurde.)
1 Stimmen
Ich habe die angenommene Antwort auf die Antwort von @Aiden Gomez geändert. Obwohl Ignacio richtig lag, war Aidans Antwort aufgrund der Änderungen von
super()
in Python 3 heute am angemessensten.