Быстро освежая свое понимание MRO, продолжал смотреть на этот пример со всех сторон
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
Out[]: (__main__.M,
__main__.B,
__main__.A,
__main__.X,
__main__.Y,
__main__.Z,
object)
Но как бы долго я ни смотрел, я не могу c войти в свой путь к X
предшествует Y
.
Итак, я прочитал потрясающий ответ Алекса Мартелли, представленный здесь: Порядок разрешения методов (MRO) в классах нового стиля?
Где пример кода:
class A(object): x = 'a'
class B(A): pass
class C(A): x = 'c'
class D(B, C): pass
assert D.x == 'c'
Отлично! Таким образом, C.x
заменит A.x
для целей MRO нового стиля. В этом есть смысл.
Может быть, это относится к примеру, который я просто не могу войти c:
class X: a = 'x'
class Y: a = 'y'
class Z: pass
class A(X, Y):pass
class B(Y, Z): pass
class M(B, A, Z): pass
print(M.a)
Out[]: x
Dagnabbit. Я все еще думаю, что M.a
должно равняться y
. Я просто не могу понять, почему X
заказывается раньше Y
. Это кажется нелогичным.
Кто-нибудь может мне помочь?