Wie funktioniert die Mehrfachvererbung Arbeit mit dem super() und verschiedene __init__() Argumente?
Ich bin, Tauchen nur in einigen fortgeschrittenen python-Themen (sowie, erweitert, um mich zumindest). Ich bin jetzt beim Lesen über mehrfache Vererbung ist und wie Sie die Verwendung von super(). Ich mehr oder weniger verstehen, wie sich die super-Funktion verwendet wird, aber (1) Was ist falsch mit, es einfach zu tun, wie dies?:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
First.__init__(self)
Second.__init__(self)
print "that's it"
Auf super(), Andrew Kuchlings Papier auf Python Warzen sagt:
Verwendung von super() wird auch richtig sein, wenn die Abgeleitete Klasse erbt
aus mehreren Basisklassen und einige oder alle von Ihnen haben init
Methoden
So, ich schrieb das obige Beispiel wie folgt:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__(self)
print "that's it"
Diese jedoch, nur läuft die erste init, die es finden kann, die in First
. (2) super()
werden verwendet, um sowohl die init aus First
und Second
, und wenn ja, wie? Läuft super(Third, self).__init__(self)
zweimal nur der Zuerst ausgeführt wird.init() zweimal..
Etwas mehr Verwirrung. Was ist, wenn die vererbten Klassen " init () - Funktionen verschiedene Argumente. Was passiert zum Beispiel, wenn ich etwas wie dieses:
class First(object):
def __init__(self, x):
print "first"
class Second(object):
def __init__(self, y, z):
print "second"
class Third(First, Second):
def __init__(self, x, y, z):
First.__init__(self, x)
Second.__init__(self, y, z)
print "that's it"
(3) Wie würde ich in der Lage sein, die relevanten Argumente zu den verschiedenen Klassen geerbt init-Funktionen die Verwendung von super()?
Alle Tipps sind willkommen!
ps. Da habe ich mehrere Fragen, die ich Ihnen gemacht Fett und nummeriert Sie..
super(Class, self)
gibt ein Objekt zurück, so sollten Sie nicht nennen Sie es mit.__init__(self)
, aber nur.__init__()
. Sie können dies in den Antworten, aber Ihre ursprüngliche erste code gibt AusnahmeTypeError: __init__() takes exactly 1 argument (2 given)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage 2, müssen Sie rufen Sie super in jeder Klasse:
Zur Frage 3, das kann nicht getan werden, die Methode muss die gleiche Signatur. Aber Sie konnte einfach ignorieren einige Parameter in der übergeordneten Klassen oder verwenden Sie Stichworte, Argumente.
super
geht gegen Python eigeneexplicit is better than implicit
hängt es davon ab, MRO (Zusammenarbeit der Eltern!) und merkt die übergeordnete Klasse von Objekten in der ersten init-Aufruf, die andere Probleme verursachen, wenn reimporting Module! Warum ist es Hinzugefügt, um Sprache, gute Frage, sieht aus wie ein half-arsed hässlicher hack.__init__()
? Initialisieren des Objekts. Sie wissen nicht, wie Sie initialisiert den ganzen - Objekt, obwohl, weil Mehrfachvererbung könnte Ihnen übergeordneten Klassen, denen Sie nicht kennen. So haben Sie zu nennensuper()
. Für "merkt sich die übergeordneten Objekte der Klasse in den ersten init-Aufruf", ich habe keine Ahnung, wovon du redest.1) Es ist nichts falsch in zu tun, wie das, was u in 1, wenn u wollen, verwenden Sie die Attribute aus der Basisklasse, dann u rufen Sie die base-Klasse init() oder auch, wenn u r mit Methoden aus der Basisklasse verwendet, die die Attribute Ihrer eigenen Klasse, dann u anrufen baseclass init()
2) Sie kann super laufen, sowohl die init ist aus Ersten und Zweiten, weil python verwendet MRO (Method resolution order)
sehen Sie den folgenden code, dies ist der Diamant-Hierarchie
Er druckt:
Instandhaltung von python wäre D,B,C,A
wenn B jedoch nicht die init-Methode geht es für C.
3) Man kann nicht alle Methoden müssen dieselbe Signatur.