Der Hauptunterschied besteht darin, dass ChildA.__init__
wird bedingungslos aufrufen Base.__init__
während ChildB.__init__
wird anrufen __init__
en welche Klasse auch immer es sein mag ChildB
Vorfahre in self
die Ahnenreihe von (die von dem abweichen können, was Sie erwarten).
Wenn Sie eine ClassC
die Mehrfachvererbung verwendet:
class Mixin(Base):
def __init__(self):
print "Mixin stuff"
super(Mixin, self).__init__()
class ChildC(ChildB, Mixin): # Mixin is now between ChildB and Base
pass
ChildC()
help(ChildC) # shows that the Method Resolution Order is ChildC->ChildB->Mixin->Base
dann Base
ist nicht mehr der Elternteil von ChildB
para ChildC
Instanzen. Jetzt super(ChildB, self)
zeigt auf Mixin
wenn self
ist eine ChildC
Instanz.
Sie haben eingefügt Mixin
zwischendurch ChildB
y Base
. Und Sie können die Vorteile nutzen mit super()
Wenn Sie also Ihre Klassen so gestalten, dass sie in einem Szenario der kooperativen Mehrfachvererbung verwendet werden können, verwenden Sie super
weil man nicht wirklich weiß, wer zur Laufzeit der Vorfahre sein wird.
El super überlegt super Beitrag y pycon 2015 Begleitvideo erklären dies ziemlich gut.
35 Stimmen
Dies ist eine sehr einfache Einführung in den Unterricht, die es wert ist, durchgenommen zu werden: realpython.com/python-super/ . Es ist leichter zu verdauen als die gegebenen Antworten, die für die meisten von uns vermutlich zu detailliert in der Implementierung von Python sind. Es hat auch Beispiele, um es konkret zu machen.
0 Stimmen
Ich habe es immer noch nicht verstanden. Ich möchte eine
class Event(tuple)
die Tupel (Zeitstempel, Beschreibung) erstellt, wobei der Zeitstempel standardmäßig die aktuelle Zeit sein sollte. Also, etwas wiee = Event(description="stored the current time")
sollte eine Instanz der UnterklasseEvent
des Tupels(1653520485,"stored...")
. Aber in__init__()
Ich kann nicht ändernself
wie ich es für eine Unterklasse vondict
. Also dachte ich, ich könnte diesuper().__init__
um die Komponenten des Tupels zu setzenself
. Darf ich?