super verwirrende Python-Mehrfachvererbung super ()

8

Ich habe mit der Mehrfachvererbung in Python herumgespielt und ich komme eine Kreuzung, die ich nicht verstehen kann, wie es passiert.

Hier ist das Vererbungslayout:

%Vor%

Der ABCD-Diamant, mit dem jeder vertraut ist. Plus eine zusätzliche Klasse "F" Ich werfe es zum Spaß.

Hier ist der Code:

%Vor%

Ausgabe:

%Vor%

Die Reihenfolge der Methodenauflösung:

%Vor%
  • foo from C, call from B anstelle von foo from C, call from D
  • foo from F, call from A schmeiße mich einfach einfach weg ...

Es scheint so, als ob die super() entsprechend der Reihenfolge der Methoden-Reihenfolge verkettet sind und die Beziehung zwischen den Klassen ignorieren, aber ich bin mir nicht sicher.

Kann mir jemand die richtige Richtung zeigen, um dieses Verhalten zu verstehen?

Bitte denken Sie daran, dass ich versuche, die Sprache selbst zu verstehen. Nicht versuchen, ein praktisches Problem zu lösen. Also habe ich keinen Anwendungsfall dafür. Aber es ist schön, wenn jemand auf einen Anwendungsfall hinweisen kann:)

  

UPDATE:

     

Zusammenfassend - super () lässt Sie einfach wissen, was neben Anrufbasis auf dem MRO ist. Es ist nicht notwendig, die Eltern. Während mro auf der Vererbungshierarchie basiert, ist mro selbst nicht die Vererbungshierarchie.

    
wilson 06.07.2012, 01:37
quelle

2 Antworten

7

Der ganze Punkt von super() folgt der Reihenfolge der Methodenauflösung. Deshalb erzählst du es deiner eigenen Klasse, nicht deiner Elternklasse. Es ist schwer für den Programmierer vorherzusagen, welche Klasse als nächstes aufgerufen wird, so dass super() sich darum kümmern kann.

Du hattest schon B von D angerufen, also wie kannst du dann C von D angerufen bekommen? D.foo () kann nur ein anderes foo () aufrufen, weil dort nur ein Funktionsaufruf steht. Es wird eine lineare Kette von Aufrufen sein, also müssen die Klassen linearisiert werden, das ist die Reihenfolge der Methodenauflösung.

    
Ned Batchelder 06.07.2012, 01:43
quelle
1

Gelegentlich finde ich es nützlich, Super für die Elternklasse aufzurufen. Ex.

%Vor%

Nun möchte ich TmpClass0s tmp_method von einer Instanz von TmpClass2 verwenden.

%Vor%

Ergebnis:

%Vor%     
Al Conrad 09.12.2014 20:36
quelle

Tags und Links