Gemäß dieser Beschreibung der Python-Methodenauflösungsreihenfolge (mro), auch bekannt als C3-Linearisierung , kann der Algorithmus rekursiv wie folgt beschrieben werden:
L(O) = <O>
L(C) = <C> + merge(L(B1),..., L(Bn), <B1,...,Bn>)
wo
O
ist die Klasse, von der jede Klasse erbt.C
ist eine Klasse, die direkt vonB1
, ...Bn
, in dieser Reihenfolge erbt .<
und>
sind Listenbegrenzer.+
ist der Listenverkettungsoperator.merge
führt seine Listenargumente in einer einzigen Liste zusammen, wie nachstehend beschrieben wird.
Das Obige kann in Worten umformuliert werden (zitiert aus dem obigen Python-Dokument):
Die Linearisierung von C ist die Summe von C plus der Zusammenführung der Linearisierungen der Eltern und der Liste der Eltern.
Der merge
Algorithmus wird wie folgt beschrieben (im Wesentlichen aus dem Python-Dokument zitiert, aber leicht umformuliert):
Betrachten Sie den Kopf der ersten Liste, dh L (B1) [0]: Wenn es sich um einen guten Kopf handelt, dh wenn er sich nicht im richtigen Ende einer der anderen Listen befindet, fügen Sie ihn zur Linearisierung von C hinzu und entfernen Sie ihn es aus allen Listen in der Zusammenführung. Andernfalls betrachten Sie den Kopf der nächsten Liste usw. Wiederholen Sie diesen Vorgang, bis keine Klassen mehr oder keine guten Köpfe mehr vorhanden sind. Im letzteren Fall ist es unmöglich, die Zusammenführung zu konstruieren.
Das folgende Beispiel dient zur Veranschaulichung. Angenommen, A
erbt direkt von B
und C
in dieser Reihenfolge und nehmen an, dass die Linearisierungen von B
und C
sind
L(B) = <B, D, E, O>
L(C) = <C, D, F, O>
Dann ist A
die Linearisierung
L(A) = <A> + merge(<B,D,E,O>, <C,D,F,O>, <B,C>)
= <A, B> + merge(<D,E,O>, <C,D,F,O>, <C>)
= <A, B, C> + merge(<D,E,O>, <D,F,O>)
= <A, B, C, D> + merge(<E,O>, <F,O>)
= <A, B, C, D, E> + merge(<O>, <F,O>)
= <A, B, C, D, E, F> + merge(<O>, <O>)
= <A, B, C, D, E, F, O>
Meine Frage ist: Welchen Zweck hat es in Bezug auf die ursprüngliche Beschreibung des Algorithmus, die Liste <B1,...,Bn>
der direkten Eltern als Argument anzugeben merge
? Wird der Algorithmus unterschiedliche Ergebnisse liefern, wenn dieses Argument weggelassen wird?