Множественное наследование Python и MRO

В настоящее время я готовлюсь к экзамену по Python, но пока не понимаю MRO и линеаризации в Python 3.

class F: pass 
class G: pass 
class H: pass
class E(G,H): pass
class D(E,F): pass 
class C(E,G): pass
class B(C,H): pass
class A(D,B,E): pass

Например, в одном из заданий возникает вопрос, возможно ли, чтобы Е происходило ДО С в линеаризации класса А.

Как определить, возможно ли это? Как можно описать алгоритм линеаризации (C3) как можно проще? Я был бы очень благодарен за всевозможные объяснения и ресурсы по этому вопросу, так как мне трудно понять линеаризацию в Python.

Заранее большое спасибо!

2 ответа

Python ищет родителей или дочерние классы в порядке DFS, а не в BFS

# This order is called Method Resolution Order (`mro()`)

class A(object):
    def dothis(self):
        print('Doing this in A')

class B(A):
    pass

class C(object):
    def dothis(self):
        print('Doing this in C')

class D(B, C):
    pass

d_instance = D()
d_instance.dothis()
# METHOD RESOLUTION ORDER
print(D.mro())

'''
OUTPUT:

# Doing this in A
# [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>]

    A

    |               C

    B(A)          /
        \
            D(B, C)

RESOLUTION ORDER IS (DFS) = D-B-A-C



             A

        /       \

    B(A)         C(A)
        \       /
            D(B, C)

If the same class appears in mro, the earlier occurrences get removed
D-B-A-C-A -> D-B-C-A, hence still a DFS
RESOLUTION ORDER IS (In Diamond shape) = D-B-C-A


'''

Класс E наследуется от G и H.

классы G и H зависимы (они ни от кого не наследуют).

Поскольку класс E не зависит от класса C, он может быть инициализирован перед ним

Другие вопросы по тегам