python Mehrfachvererbung übergeben von Argumenten in Konstruktoren mit super
Betrachten Sie den folgenden Ausschnitt aus python-code
class A(object):
def __init__(self, a):
self.a = a
class B(A):
def __init__(self, a, b):
super(B, self).__init__(a)
self.b = b
class C(A):
def __init__(self, a, c):
super(C, self).__init__(a)
self.c = c
class D(B, C):
def __init__(self, a, b, c, d):
#super(D,self).__init__(a, b, c) ???
self.d = d
Ich Frage mich, wie kann ich pass a
, b
und c
zu entsprechenden Basis von Klassen-Konstruktoren.
Dank,
Möglich, Duplikat der Wie funktioniert Python ' s super() Arbeit mit Mehrfachvererbung?
Sie können rufen Sie
Lesen Sie auch über die Diamant-problem
Python ' s super() als super!!!
Ich denke, das ist nicht ein Duplikat des anderen berühmten Frage, denn diese Frage ist, die sich insbesondere mit wie machen die super Arbeit nennt, im Fall von Diamant-Vererbung, während die andere ist eine Frage, über wie super klappt im Allgemeinen.
Sie können rufen Sie
__init__
zweimal für B
und C
.Lesen Sie auch über die Diamant-problem
Python ' s super() als super!!!
Ich denke, das ist nicht ein Duplikat des anderen berühmten Frage, denn diese Frage ist, die sich insbesondere mit wie machen die super Arbeit nennt, im Fall von Diamant-Vererbung, während die andere ist eine Frage, über wie super klappt im Allgemeinen.
InformationsquelleAutor Ling | 2016-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wenn der Umgang mit mehrfach-Vererbung im Allgemeinen, Ihre Basisklassen (leider) sollte entworfen für mehrfache Vererbung. Klassen
B
undC
in deinem Beispiel nicht, und so werden Sie nicht finden konnte, eine richtige Art und Weise anwendensuper
imD
.Einer der häufigsten Wege, der Gestaltung Ihrer Basisklassen bei Mehrfachvererbung, ist für die Mitte-level-base-Klassen zu akzeptieren, extra-args in Ihrer
__init__
Methode, die Sie nicht beabsichtigen zu verwenden, und geben Sie diese an Ihresuper
nennen.Hier ist ein Weg, es zu tun in python:
Diese können betrachtet werden als enttäuschend, aber das ist einfach so wie es ist.
kw.pop('something')
können Sie nursomething
als argument.richtig! behoben, danke. (Angefangen habe ich es mit position args daran, wechselte dann in kwargs...)
Danke, shx2, schöne Lösung!
Aber eine andere Frage über super(). Von MRO von D, d.h., D,B,C,Ein, dann, wenn die Ausführung
super(D,self).__init__(a=a,b=b,c=c)
es wird rufen Sie die init von B. Aber innerhalb KONSTR von B wird aufgerufensuper(B,self).__init__(**kw)
dann von MRO von B, was nun folgt, ist für B Ein, dann sollte es gehen nennen KONSTR A. warum Aber stattdessen geht es auf den Aufruf KONSTR von C anstelle von KONSTR? Vielen Dank,ruft die nächste Methode in der MRO-Bestellung. Die MRO ist
DBCA
, was bedeutet, dassC
kommt nachB
, trotz der Tatsache, dassC
stammt ausA
. Deshalb ist der Unterricht sollte so gestaltet werden für die mehrfache Vererbung-wenn Sie schreiben, Sie können nicht davon ausgehen, Sie wissen welche Klasse kommt, nachdem Ihre Klasse in der MRO-Bestellung, denn das ist nur dann bestimmt später, wenn Ihre Klasse wird als Basis verwendet, die in eine mehrfache Vererbung.InformationsquelleAutor shx2
Leider, es gibt keinen Weg, um diese Arbeit zu machen mit
super()
ohne änderung der Basis-Klassen. Jeder Aufruf der Konstruktoren fürB
oderC
wird, um zu versuchen, und rufen Sie die nächste Klasse in der Methode Auflösung Um, die immerB
oderC
statt derA
Klasse, dass dieB
undC
Klasse Konstruktoren übernehmen.Die alternative ist der Aufruf der Konstruktoren explizit ohne den Einsatz von
super()
in jeder Klasse.Es ist immer noch ein Nachteil, der hier als
A
Konstruktor würde zweimal aufgerufen werden, die nicht wirklich haben viel eines Effektes, in diesem Beispiel, aber die Probleme verursachen können, in komplexeren Konstruktoren. Sie können eine Prüfung, um zu verhindern, dass der Konstruktor ausgeführt, mehr als einmal.Manche nennen dies ein Manko von
super()
, und es ist in gewissem Sinne, aber es ist auch nur eine Schwachstelle auf mehrfache Vererbung im Allgemeinen. Diamant-Vererbung Muster sind oft anfällig für Fehler. Und viele Problemumgehungen für Sie führen auch unübersichtlicher und fehleranfälliger code. Manchmal die beste Antwort ist, zu versuchen und umgestalten von code zu verwenden, weniger multiple Vererbung.InformationsquelleAutor Brendan Abel