Der Zweck von Super ist, Erbschaftdiamanten zu behandeln. Wenn die Vererbungsstruktur der Klasse nur Single-Vererbung verwendet, führt die Verwendung von super() zu denselben Aufrufen wie explizite Aufrufe an die Klasse "parent".
dieses Erbe Diamant Bedenken Sie:
class A(object):
def __init__(self):
print('Running A.__init__')
super(A,self).__init__()
class B(A):
def __init__(self):
print('Running B.__init__')
super(B,self).__init__()
class C(A):
def __init__(self):
print('Running C.__init__')
super(C,self).__init__()
class D(B,C):
def __init__(self):
print('Running D.__init__')
super(D,self).__init__()
foo = D()
die
Running D.__init__
Running B.__init__
Running C.__init__
Running A.__init__
druckt, während, wenn wir B
-B2
ändern und explizite Aufrufe an die Mutter __init__
verwenden:
class B2(A):
def __init__(self):
print('Running B.__init__')
A.__init__(self)
class D2(B2,C):
def __init__(self):
print('Running D.__init__')
super(D2,self).__init__()
bar = D2()
dann die Kette von Initaufrufen wird
Running D.__init__
Running B.__init__
Running A.__init__
So wird der Aufruf an C.__init__
vollständig übersprungen.
Es gibt keine bevorzugte Option.
Wenn Sie garantieren können, dass Sie die Mehrfachvererbung nicht unterstützen möchten, sind explizite übergeordnete Anrufe einfacher und übersichtlicher als . Wenn Sie jetzt oder in Zukunft mehrere Vererbungen unterstützen möchten, müssen Sie super()
verwenden. Aber verstehen Sie, dass es some pitfalls bei der Verwendung von Super beteiligt sind, aber mit proper use diese Fallstricke vermieden werden können.
'Parent .__ init __()' sieht für mich nicht korrekt aus. Ich würde erwarten, dass Sie einen 'TypeError' geben, wenn Sie ihn ausführen. – Kevin
Die letzte gibt Ihnen 'TypeError: ungebundene Methode __init __() muss mit Parent-Instanz als erstes Argument aufgerufen werden (hat nichts stattdessen)', genau weil das Argument fehlt. – dhke
'Elternteil.__init __ (selbst) 'Ich glaube, du meinst, ich mag diese Methode, da sie für mich expliziter ist ... die MRO ist gruselig schwarze Magie –