Pythons super () -Funktion

8

Im unteren Beispiel rufen die letzten beiden Zeilen in der B.Go() -Methode die Methode Go() von class A auf. Sind sie funktional identisch? Ist die Verwendung von super() der einzige Vorteil, dass ich den vererbten Klassennamen nicht kennen muss?

%Vor%     
tMC 14.06.2011, 23:51
quelle

4 Antworten

14

Nein, super() bewirkt etwas, das direkt an A.Go nicht gesendet werden kann. super(B, self).Go() ruft die nächste Methode in der Reihenfolge der Methodenauflösung auf. Es ruft die Methode auf, die hätte heißen sollen hatte B die Methode überhaupt nicht implementiert. In der direkten linearen Vererbung ist dies immer A , also gibt es keinen wirklichen Unterschied (neben der Klasse, die du wiederholst). Im Fall der Mehrfachvererbung ist jedoch die nächste Klasse in der normalen Methodenauflösungsreihenfolge nicht notwendigerweise die direkte Basisklasse von die aktuelle Klasse. Siehe die Erklärung für die Diamantvererbung in Guidos ursprünglicher Erklärung dieser Funktionen.

    
Thomas Wouters 14.06.2011, 23:56
quelle
4

Zusätzlich zu der ausgezeichneten Antwort von Thomas Wouters würde ich hinzufügen Das super() ist zusätzlich sehr nützlich, da es sich um eine berechnete Indirektion handelt. Ein Schlüsselvorteil bei der Verwendung von super() besteht darin, dass Sie die Delegate-Klasse nicht anhand ihres Namens angeben müssen, wodurch die Basisklasse später einfacher geändert werden kann. Raymond Hettinger hat einen tollen Beitrag dazu: Pythons Super () gilt als super!

    
zeekay 15.06.2011 00:17
quelle
2

Nicht genau. Mit Super brauchen Sie nur B instanziieren, es gibt eine Instanz. Die zweite Zeile erstellt eine neue Instanz von A, kann möglicherweise Nebeneffekte im Initialisierer haben und besitzt kein anderes Instanzattribut oder -status (von B instance inst ).

    
Keith 14.06.2011 23:56
quelle
1

Sie sind ganz anders. Aufruf von A (). Go () Sie erstellen ein ganz neues Objekt, das kein Attribut mit der Instanz teilt, in der es erstellt wurde.

Ihr Beispiel ist zu einfach, Sie müssen einen Status haben, um das wirklich unterschiedliche Verhalten zu zeigen

    
Riccardo Galli 14.06.2011 23:56
quelle

Tags und Links