この Pythonのメソッド解決順序(mro)、別名C3線形化の説明によれば、アルゴリズムは次のように再帰的に説明できます。
L(O) = <O>
L(C) = <C> + merge(L(B1),..., L(Bn), <B1,...,Bn>)
どこ
O
すべてのクラスが継承するクラスです。C
は、、B1
...、から直接Bn
この順序で継承するクラスです。<
および>
リスト区切り文字です。+
リスト連結演算子です。merge
以下で説明する方法で、そのリスト引数を単一のリストにマージします。
上記は単語で言い換えることができます(上記のPythonドキュメントから引用):
Cの線形化は、Cと、親の線形化と親のリストのマージの合計です。
merge
(本質的にPythonのドキュメントから引用したが、わずかに言い換え)以下のようなアルゴリズムが記載されています。
最初のリストの先頭、つまりL(B1)[0]を検討します。それが良い先頭である場合、つまり他のリストの適切な末尾にない場合は、Cの線形化に追加して削除しますマージのすべてのリストから。そうでない場合は、次のリストの頭などを検討します。クラスがなくなるか、頭がなくなるまで繰り返します。後者の場合、マージを構築することは不可能です。
次の例は、説明のためのものです。仮定A
から直接継承するB
とC
、このために、との線形化したとするB
とC
しています
L(B) = <B, D, E, O>
L(C) = <C, D, F, O>
次に、A
線形化は
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>
私の質問は、アルゴリズムの元の説明に関して、<B1,...,Bn>
直接の親のリストを引数として提供する目的は何merge
ですか?この引数を省略した場合、アルゴリズムは異なる結果を生成しますか?