67 lines
1.5 KiB
Org Mode
67 lines
1.5 KiB
Org Mode
: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]]
|
|
|