Порядок разрешения методов (MRO) в классах нового стиля? (сокращение) - PullRequest
0 голосов
/ 21 июня 2020

Быстро освежая свое понимание 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. Это кажется нелогичным.

Кто-нибудь может мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...