Was passiert, wenn Sie alte und neue Stilklassen in einer Hierarchie mischen?

9

Angenommen, Sie haben etwas wie

%Vor%

Wie verhält sich Python in Bezug auf die Reihenfolge der Vererbung und Methodenauflösung, wenn Sie eine gemischte Hierarchie haben? Befolgt es die alte Durchquerung, die neue Durchquerung, eine Mischung der beiden, abhängig davon, welcher Zweig der Hierarchie läuft?

    
Stefano Borini 11.06.2013, 11:57
quelle

2 Antworten

2

Die Antwort ist "eine Mischung aus beidem". Sie können sich selbst überprüfen, indem Sie inspect.getmro() verwenden, was sowohl für alte als auch für neue Klassen gilt. Sie gibt die MRO, d. H. Die Reihenfolge der Methodenauflösung, zurück.

Jede Klasse im alten Stil hat eine MRO, bei der es sich um die erste, letzte bis letzte Basis handelt. (Dies ist eine schlechte Idee für die kompliziertesten Fälle, aber als Rückwärtskompatibilität beibehalten.) Wir können es so ausdrücken, das funktioniert, weil die MRO aller Elternklassen bereits berechnet wurde:

%Vor%

Bei neuartigen Klassen verwendet der Algorithmus die gleiche Grundidee, ist aber komplizierter. Er beginnt auch mit [new_class] , gefolgt von einer etwas schlaueren Zusammenführung der Listen. mro(first_base) , mro(second_base) , usw.

Unabhängig davon, ob jede dieser Basisklassen im alten oder im neuen Stil erstellt wurde, haben sie bereits ihre eigene MRO berechnet, und diese MROs (als Listen) sind die einzigen, die zur Berechnung der MRO der neuen Klasse verwendet werden. p>     

Armin Rigo 11.06.2013, 13:47
quelle
1

Von Dokumenten :

  

Die Linearisierung von C ist die Summe von C plus die Verschmelzung von   Linearisierungen der Eltern und die Liste der Eltern.

Das würde bedeuten, dass es davon abhängt, welcher Zweig der Hierarchie gerade läuft (d. h. es ist eine Mischung).

Es muss rekursiv gemacht werden, damit ich kein anderes Verhalten erwarte.

    
freakish 11.06.2013 13:08
quelle

Tags und Links