Aufruf von Init für mehrere Elternklassen mit Super? [Duplikat]

8

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?

%Vor%     
scruffyDog 04.11.2011, 17:01
quelle

3 Antworten

17

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:

%Vor%

In Python 3 können Sie super() anstelle von super(type, instance) verwenden.

    
Cat Plus Plus 04.11.2011, 17:06
quelle
26

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.

    
Sven Marnach 04.11.2011 17:04
quelle
7

Sie könnten sie einfach direkt mit Parent.__init__(self) aufrufen:

%Vor%     
chown 04.11.2011 17:05
quelle