Python-Vererbung? Ich habe eine Klassenstruktur (unten) und möchte, dass die Kindklasse __init__
beider Eltern aufruft. Ist das möglich "super" oder ist es nur eine schreckliche Idee?
Aufruf über super
ruft nicht alle Eltern auf, es ruft die nächste Funktion in der MRO-Kette auf. Damit dies ordnungsgemäß funktioniert, müssen Sie super
in allen __init__
s verwenden:
In Python 3 können Sie super()
anstelle von super(type, instance)
verwenden.
Die Idee von super()
ist, dass Sie nicht die beiden Methoden __init__()
der Oberklassen separat aufrufen müssen - super()
kümmert sich darum, vorausgesetzt, Sie verwenden es korrekt - siehe Raymond Hettinger's" Python's super () als super angesehen! " für eine Erklärung.
Das heißt, ich finde oft die Nachteile von super()
für Konstruktor-Aufrufe die Vorteile überwiegen. Beispielsweise müssen alle Konstruktoren ein zusätzliches **kwargs
-Argument bereitstellen, alle Klassen müssen zusammenarbeiten, nicht kooperierende externe Klassen benötigen einen Wrapper. Sie müssen darauf achten, dass der Name jedes Konstruktorparameters für all Ihre Klassen usw.
In den meisten Fällen ist es daher einfacher, die Basisklassenmethoden, die Sie für Konstruktoraufrufe aufrufen möchten, explizit zu benennen:
%Vor% Ich verwende super()
für Funktionen, die einen garantierten Prototyp haben, wie zum Beispiel __getattr__()
. In diesen Fällen gibt es keine Nachteile.
Tags und Links python multiple-inheritance super init new-style-class