In Anons Antwort:
"Wenn Sie __init__
zusätzlich zu dem, was in der aktuellen Klasse getan wird, etwas von Super's tun __init__
müssen, müssen Sie es selbst nennen, da dies nicht automatisch geschieht."
Es ist unglaublich: Er formuliert genau das Gegenteil des Erbprinzips.
Es ist nicht so, dass "etwas von Super __init__
(...) nicht automatisch passiert" , es ist so, dass es automatisch passieren würde, aber es passiert nicht, weil die Basisklasse ' __init__
durch die Definition der abgeleiteten Klassen überschrieben wird__init__
Warum also eine abgeleitete Klasse definieren __init__
, da sie überschreibt, was angestrebt wird, wenn jemand auf Vererbung zurückgreift ?
Das liegt daran, dass man etwas definieren muss, das NICHT in der Basisklasse ausgeführt wird __init__
, und die einzige Möglichkeit, dies zu erreichen, besteht darin, seine Ausführung in eine abgeleitete Klassenfunktion zu setzen __init__
.
Mit anderen Worten, man braucht etwas in der Basisklasse " __init__
zusätzlich zu dem, was automatisch in der Basisklasse gemacht wird", __init__
wenn diese nicht überschrieben würde.
NICHT das Gegenteil.
Dann besteht das Problem darin, dass die gewünschten Anweisungen, die in der Basisklasse 'vorhanden __init__
sind, zum Zeitpunkt der Instanziierung nicht mehr aktiviert werden. Um diese Inaktivierung auszugleichen, ist etwas Besonderes erforderlich: explizites Aufrufen der Basisklasse ' __init__
, um die von der Basisklasse durchgeführte Initialisierung beizubehalten , NICHT ZU HINZUFÜGEN' __init__
. Genau das steht im offiziellen Dokument:
Eine überschreibende Methode in einer abgeleiteten Klasse möchte möglicherweise die gleichnamige Basisklassenmethode erweitern, anstatt sie einfach zu ersetzen . Es gibt eine einfache Möglichkeit, die Basisklassenmethode direkt aufzurufen: Rufen Sie einfach BaseClassName.methodname (self, arguments) auf.
http://docs.python.org/tutorial/classes.html#inheritance
Das ist die ganze Geschichte:
Wenn das Ziel darin besteht, die von der Basisklasse durchgeführte Initialisierung, dh die reine Vererbung, beizubehalten, ist nichts Besonderes erforderlich. Es muss lediglich vermieden werden, eine __init__
Funktion in der abgeleiteten Klasse zu definieren
Wenn das Ziel darin besteht, die von der Basisklasse durchgeführte Initialisierung zu ERSETZEN, __init__
muss sie in der abgeleiteten Klasse definiert werden
Wenn das Ziel darin besteht, Prozesse zu der von der Basisklasse durchgeführten Initialisierung hinzuzufügen, muss eine abgeleitete Klasse __init__
definiert werden, die einen expliziten Aufruf der Basisklasse umfasst__init__
Was ich an dem Posten von Anon erstaunlich finde, ist nicht nur, dass er das Gegenteil der Vererbungstheorie zum Ausdruck bringt, sondern dass 5 Leute an diesem Upvoted vorbeigegangen sind, ohne ein Haar zu drehen, und außerdem gab es in 2 Jahren niemanden, der darauf reagierte ein Thread, dessen interessantes Thema relativ oft gelesen werden muss.
object
ein Tippfehler war. Aber jetzt haben Sie nicht einmal densuper
Titel, auf den sich Ihre Frage bezieht.