richtiger Weg super zu benutzen (Argument übergeben)
So war ich nach Python ist Super Schädlichund ging zu testen, seinem Beispiele.
Jedoch Beispiel 1-3die zeigen soll, den richtigen Weg der Berufung super
beim Umgang mit __init__
Methoden, die erwarten, dass andere Argumente, flat-out nicht funktioniert.
Dies ist, was ich bekomme:
~ $ python example1-3.py
MRO: ['E', 'C', 'A', 'D', 'B', 'object']
E arg= 10
C arg= 10
A
D arg= 10
B
Traceback (most recent call last):
File "Download/example1-3.py", line 27, in <module>
E(arg=10)
File "Download/example1-3.py", line 24, in __init__
super(E, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 14, in __init__
super(C, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 4, in __init__
super(A, self).__init__(*args, **kwargs)
File "Download/example1-3.py", line 19, in __init__
super(D, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 9, in __init__
super(B, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
Scheint es, dass object
selbst gegen eine der besten Praktiken, die in dem Dokument erwähnt werden, dass die Methoden, die super
akzeptieren muss *args
und **kwargs
.
Nun offensichtlich Herr Ritter erwartete, dass seine Beispiele, um zu arbeiten, so ist das etwas, was geändert wurde in den letzten Versionen von Python? Ich habe überprüft, 2.6 und 2.7, und es nicht auf beiden.
Also, was ist der richtige Weg, um mit diesem problem umzugehen?
InformationsquelleAutor der Frage cha0site | 2012-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Manchmal zwei-Klassen müssen möglicherweise einige parameter-Namen im common. In diesem Fall können Sie keine pop-Schlüssel-Wert-Paare aus der
**kwargs
oder entfernen Sie Sie aus*args
. Stattdessen definieren Sie eineBase
- Klasse, die im Gegensatz zuobject
absorbiert/ignoriert Argumente:Erträge
Beachten Sie, dass für diese Arbeit
Base
muss der vorletzten Klasse in der MRO.InformationsquelleAutor der Antwort unutbu
Wenn du gehst, um eine Menge von inheritence (das ist hier der Fall), schlage ich Sie alle übergeben Parameter mit
**kwargs
und dannpop
Ihnen Recht, nachdem Sie Sie verwenden (es sei denn, Sie brauchen Sie in oberen Klassen).Dies ist der einfachste Weg zur Lösung dieser Art von Problemen.
InformationsquelleAutor der Antwort juliomalegria
Erläutert in Python ' s super() als superein Weg ist, um Klasse Essen, die Argumente, die es erfordert, und pass den rest an. Somit wird, wenn die Aufruf-Kette erreicht
object
alle Argumente wurden schon gegessen, undobject.__init__
aufgerufen werden, ohne Argumente (wie erwartet). So Ihr code sollte wie folgt Aussehen:InformationsquelleAutor der Antwort Björn Pollex