:PROPERTIES:
:ID:       1512a18b-221a-4f15-90a0-9ccac023dfd6
:mtime:    20220528175444
:ctime:    20220522101323
:END:
#+title: 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 [[https://en.wikipedia.org/wiki/C3_linearization][C3 superclass linearization]].

* Ordres de résulution

#+BEGIN_SRC python :results output
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__=}')
#+END_SRC

#+RESULTS:
: 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).

#+BEGIN_SRC python :results output
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__=}')
#+END_SRC

#+RESULTS:
: 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)

* Références
 * [[https://python.plainenglish.io/advanced-python-classes-objects-and-mro-423bb01521fb][Advanced Python classes objects and mro - Medium]]

