多重継承PythonのC3直線流解析アルゴリズム

 

Pythonの多重継承のMRO

Python2.1では、古典的なタイプ、深さ優先の解析アルゴリズムを使用。
python2.2、幅優先と深さ優先アルゴリズムアルゴリズムを使用して、新しいカテゴリの導入。
将来のバージョンでのpython2.3、クラシックと新しいクラスがDFSアルゴリズムとC3アルゴリズムを使用し、共存します。
クラシックでPython2

class A(object):
    pass

新しいクラスのpython3

class A:
    pass

C3アルゴリズム

コンピューティングにおいて、C3スーパー線形である多重継承の存在下での方法が継承されるべき順序(「線形」)を取得するために主に使用されるアルゴリズム、およびしばしばメソッド解決順序(MRO)と呼ばれる。
これは、ウィキペディアであります以下、この画像に定義されている複数の継承図です。
ここに画像を挿入説明

だからここMRO解決順序は、についてですか?単純な答えを引き出すことは困難図。
次のように導出C3線形アルゴリズムは次のとおりです。
想定し、クラスCは、親クラスB1から継承された、... Bnが、決議リストクラスCは、下記式:
ここに画像を挿入説明
この式は、リストCは、そのすべての親クラスとその親のリストを解析することによって解析されていることを示しています一緒にクラスマージ得。
マージ操作は、以下のステップに分かれています。

  1. 選択してマージ現在のリストについては、レコードの最初のリストをK
  2. だから、H =ヘッド(K)は、 hは、他のリストに表示されていない場合は、テール最初の要素を除いたリストを、と呼ばれる尾の残りの部分は)これは、上場線形化クラスCを追加し、手順2を繰り返して、すべてのマージのリストから削除します。
  3. それ以外の場合は、セットKをするマージ次のリスト操作を2繰り返されます
  4. あなたがいる場合、マージ、すべてのクラスが削除された、出力クラスが正常に作成され、あなたがで見つけることができない場合H、出力Cのクラスが例外をスローします。

導出

私たちは、上の写真は、導出しようとすることです使用MRO解決順序を。
上記画像は、Pythonコードに変換され、以下の通りである:
変換Pythonコード

O = object
class A(O): pass class B(O): pass class C(O): pass class D(O): pass class E(O): pass class K1(A, B, C): pass class K2(D, B, E): pass class K3(D, A): pass class Z(K1, K2, K3): pass print(Z.mro())

導出

L(K1) = K1 + merge(L[A],L[B],L[C],(A,B,C))
      = K1 + merge(L[A,O],L[B,O],L[C,O],(A,B,C)) = [K1,A] + merge(L[O],L[B,O],L[C,O],(B,C)) = [K1,A,B] + merge(L[O],L[O],L[C,O],(C)) = [K1,A,B,C] + merge(L[O],L[O],L[O]) = [K1,A,B,C,O] L(K2) = [K2,D,B,E,O] L(K3) = [K3,D,A,O] 以上是K1,K2,K3的解析顺序 下面是Z的推导过程 L(Z) = Z + merge(L(K1)+L(K2)+L[K3],(K1,K2,K3)) = Z + merge(L[K1,A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K1,K2,K3)) = [Z,K1] + merge(L[A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K2,K3)) = [Z,K1,K2] + merge(L[A,B,C,O]+L(D,B,E,O)+L(K3,D,A,O),(K3)) = [Z,K1,K2,K3] + merge(L[A,B,C,O]+L(D,B,E,O)+L(D,A,O)) = [Z,K1,K2,K3,D] + merge(L[A,B,C,O]+L(B,E,O)+L(A,O)) = [Z,K1,K2,K3,D,A] + merge(L[B,C,O]+L(B,E,O)+L(O)) = [Z,K1,K2,K3,D,A,B] + merge(L[C,O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C] + merge(L[O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C,E,O]

Z解決順序:我々は最終的な答えになってきたZ-> K1-> K2-> K3- > D-> A-> B-> C-> E-> O
の答えを確認するために、我々は、Pythonで実行します

print(Z.mro())

結果は以下の通りであります

[<class '__main__.Z'>, <class '__main__.K1'>, <class '__main__.K2'>, <class '__main__.K3'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>]

そして、我々は、プロセスC3アルゴリズムで同じ結果を導き出します。

Pythonの多重継承のMRO

Python2.1では、古典的なタイプ、深さ優先の解析アルゴリズムを使用。
python2.2、幅優先と深さ優先アルゴリズムアルゴリズムを使用して、新しいカテゴリの導入。
将来のバージョンでのpython2.3、クラシックと新しいクラスがDFSアルゴリズムとC3アルゴリズムを使用し、共存します。
クラシックでPython2

class A(object):
    pass

新しいクラスのpython3

class A:
    pass

C3アルゴリズム

コンピューティングにおいて、C3スーパー線形である多重継承の存在下での方法が継承されるべき順序(「線形」)を取得するために主に使用されるアルゴリズム、およびしばしばメソッド解決順序(MRO)と呼ばれる。
これは、ウィキペディアであります以下、この画像に定義されている複数の継承図です。
ここに画像を挿入説明

だからここMRO解決順序は、についてですか?単純な答えを引き出すことは困難図。
次のように導出C3線形アルゴリズムは次のとおりです。
想定し、クラスCは、親クラスB1から継承された、... Bnが、決議リストクラスCは、下記式:
ここに画像を挿入説明
この式は、リストCは、そのすべての親クラスとその親のリストを解析することによって解析されていることを示しています一緒にクラスマージ得。
マージ操作は、以下のステップに分かれています。

  1. 選択してマージ現在のリストについては、レコードの最初のリストをK
  2. だから、H =ヘッド(K)は、 hは、他のリストに表示されていない場合は、テール最初の要素を除いたリストを、と呼ばれる尾の残りの部分は)これは、上場線形化クラスCを追加し、手順2を繰り返して、すべてのマージのリストから削除します。
  3. それ以外の場合は、セットKをするマージ次のリスト操作を2繰り返されます
  4. あなたがいる場合、マージ、すべてのクラスが削除された、出力クラスが正常に作成され、あなたがで見つけることができない場合H、出力Cのクラスが例外をスローします。

導出

私たちは、上の写真は、導出しようとすることです使用MRO解決順序を。
上記画像は、Pythonコードに変換され、以下の通りである:
変換Pythonコード

O = object
class A(O): pass class B(O): pass class C(O): pass class D(O): pass class E(O): pass class K1(A, B, C): pass class K2(D, B, E): pass class K3(D, A): pass class Z(K1, K2, K3): pass print(Z.mro())

導出

L(K1) = K1 + merge(L[A],L[B],L[C],(A,B,C))
      = K1 + merge(L[A,O],L[B,O],L[C,O],(A,B,C)) = [K1,A] + merge(L[O],L[B,O],L[C,O],(B,C)) = [K1,A,B] + merge(L[O],L[O],L[C,O],(C)) = [K1,A,B,C] + merge(L[O],L[O],L[O]) = [K1,A,B,C,O] L(K2) = [K2,D,B,E,O] L(K3) = [K3,D,A,O] 以上是K1,K2,K3的解析顺序 下面是Z的推导过程 L(Z) = Z + merge(L(K1)+L(K2)+L[K3],(K1,K2,K3)) = Z + merge(L[K1,A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K1,K2,K3)) = [Z,K1] + merge(L[A,B,C,O]+L(K2,D,B,E,O)+L(K3,D,A,O),(K2,K3)) = [Z,K1,K2] + merge(L[A,B,C,O]+L(D,B,E,O)+L(K3,D,A,O),(K3)) = [Z,K1,K2,K3] + merge(L[A,B,C,O]+L(D,B,E,O)+L(D,A,O)) = [Z,K1,K2,K3,D] + merge(L[A,B,C,O]+L(B,E,O)+L(A,O)) = [Z,K1,K2,K3,D,A] + merge(L[B,C,O]+L(B,E,O)+L(O)) = [Z,K1,K2,K3,D,A,B] + merge(L[C,O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C] + merge(L[O]+L(E,O)+L(O)) = [Z,K1,K2,K3,D,A,B,C,E,O]

Z解決順序:我々は最終的な答えになってきたZ-> K1-> K2-> K3- > D-> A-> B-> C-> E-> O
の答えを確認するために、我々は、Pythonで実行します

print(Z.mro())

結果は以下の通りであります

[<class '__main__.Z'>, <class '__main__.K1'>, <class '__main__.K2'>, <class '__main__.K3'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>]

そして、我々は、プロセスC3アルゴリズムで同じ結果を導き出します。

おすすめ

転載: www.cnblogs.com/demon-frog/p/11353367.html