Python の C3 メソッドの解決順序について読んだとき、「子は親よりも優先され、サブクラスの順序は尊重される」と簡略化されているとよく耳にします。しかし、すべてのサブクラスが同じ祖先から継承されている場合にのみ、これが当てはまるようです。
例えば
class X():
def FOO(self):
return 11
class A(X):
def doIt(self):
return super().FOO()
def FOO(self):
return 42
class B(X):
def doIt(self):
return super().FOO()
def FOO(self):
return 52
class KID(A,B):
pass
ここで、KID の MRO は次のとおりです。KID、A、B、X
ただし、 B を代わりに変更した場合:
class B(object):
KID の MRO は次のようになります: KID、A、X、B
すべての KID の親の検索を完了する前に、A のスーパークラスを検索しているようです。
したがって、「子供優先、幅優先」から「子供優先、共通の祖先の場合は幅優先」、そうでなければ深さ優先」よりも少し直感的ではないように思えます。
クラスが共通の祖先の使用を停止すると、MRO が変更され (その 1 つのリンクを除いて全体的な階層は同じですが)、そのクラスのメソッドではなく、より深い祖先メソッドを呼び出すようになるというのは、かなりの落とし穴です。