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.
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!
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
Tags und Links python inheritance oop