Files
org-roamings/20220522101323-method_resolution_order.org
2022-06-04 12:57:39 +02:00

1.5 KiB

Method Resolution Order

Introduction

Le Method Resolution Order (MRO) est le mécanisme de recherche de méthodes et attributs dans les classes mères, notamment lors d'héritages multiples. Celui-ci est basé sur l'algorithme C3 superclass linearization.

Ordres de résulution

class A:
    def func(self):
        print("B.func() called")

class B(A):
    def func(self):
        print("B.func() called")

class C(B, A):
    pass

c = C()
c.func()
print(f'{C.__mro__=}')
B.func() called
C.__mro__=(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

Ordre : C -> B -> A -> object (pour un même niveau d'héritage, de gauche à droite).

class A:
    def func(self):
        print("A.func() called")

class B:
    def func(self):
        print("B.func() called")

class C(A, B):
    pass

class D(C, B):
    pass

d = D()
d.func()
print(f'{D.__mro__=}')
A.func() called
D.__mro__=(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

Ordre : D -> C -> A -> B -> object. (classe mères, de gauche à droite)