1

Python の mro(メソッド解決順序) を理解するのに少し苦労しています。Python は左から右に動作します。したがって、私の理解によれば、M を呼び出す順序は次のようになります。M、B、A、Z、X、Y

class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

print(M.mro())

しかし、呼び出しの正しい順序は次のとおりです。

    [<class '__main__.M'>,
 <class '__main__.B'>,
 <class '__main__.A'>,
 <class '__main__.X'>,
 <class '__main__.Y'>,
 <class '__main__.Z'>,
 <class 'object'>]

誰でも順序を説明して、これを理解するのを手伝ってくれますか? ありがとうございました

4

1 に答える 1

2

mro は Python2.3 から C3 アルゴリズムに基づいており、「マージ」はそのアルゴリズムの中核です。マージの仕組み。あなたのコードによると、ここに mro(M) を取得する方法をリストできます。

mro(M) = [M] + merge(mro(B), mro(A), mro(Z), [B,A,Z])    

mro(B) = [B] + merge(mro(Y) , mro(Z)) = [B] + merge([Y] , [Z])
       = [B,Y] + merge([Z]) 
       = [B,Y,Z]

mro(A) = [A] + merge(mro(X) , mro(Y)) 
       = [A] + merge([X],[Y]) 
       = [A,X,Y]

mro(Z) = [Z]

に戻るmro(M):

mro(M) = [M] + merge([B,Y,Z), [A,X,Y], [Z], [B,A,Z]) 
       = [M,B] + merge([Y,Z], [A,X,Y], [Z], [A,Z]) 
       = [M,B,A] + merge([Y,Z], [X,Y], [Z], [Z]) 
       = [M,B,A,X] + merge([Y,Z] + [Y] + [Z], [Z]) 
       = [M,B,A,X,Y] + merge([Z] + [Z] + [Z]) 
       = [M,B,A,X,Y,Z]
于 2016-06-02T07:11:20.537 に答える