Menu
Coddy logo textTech

Ordre de résolution des méthodes

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 21 sur 64.

L'ordre de résolution des méthodes (MRO - Method Resolution Order) est la séquence que Python utilise pour rechercher des méthodes lorsque plusieurs classes ont le même nom de méthode.

Voici un exemple avec plusieurs classes ayant la même méthode :

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

Vérifiez le MRO en utilisant __mro__ :

print(C.__mro__)

Sortie :

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

L'attribut __mro__ est un tuple qui contient toutes les classes dans l'ordre de résolution. Le premier élément (__mro__[0]) est toujours la classe elle-même (C), suivie des classes parentes de gauche à droite (A, puis B), et enfin la classe d'objet intégrée (built-in object class).

Créez un objet et appelez la méthode :

c = C()
print(c.method())

Sortie :

Method from A

Python a trouvé la méthode dans la classe A en premier (à l'index 1 dans le MRO), il a donc utilisé celle-là.

Changez l'ordre d'héritage pour voir la différence :

class D(B, A):  # B vient avant A maintenant
    pass

print(D.__mro__)
d = D()
print(d.method())

Sortie :

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Method from B

Maintenant, Python trouve la méthode de B en premier car B précède A dans la liste d'héritage. Vous pouvez accéder à des classes spécifiques dans le MRO en utilisant l'indexation - D.__mro__[0] est D lui-même, D.__mro__[1] est B, et D.__mro__[2] est A.

Vous pouvez également utiliser la méthode mro() :

print(C.mro())

Cela donne le même résultat que __mro__ mais sous forme de liste.

Point clé : Python recherche les méthodes dans l'ordre MRO - la classe elle-même en premier (index 0), puis les classes parentes de gauche à droite telles qu'énumérées dans la définition de la classe (indices 1, 2, etc.). La première méthode trouvée est utilisée.

challenge icon

Défi

Moyen

Dans ce défi, vous allez implémenter une hiérarchie de classes.

Vous devrez modifier ces fichiers :

  • device.py : Implémentez la classe de base Device
  • screen.py : Implémentez la classe Screen qui hérite de Device
  • computer.py : Implémentez la classe Computer qui hérite de Device
  • laptop.py : Implémentez la classe Laptop avec l'héritage multiple
  • driver.py - Implémentez des cas de test qui vérifieront que votre implémentation fonctionne correctement

Chaque fichier contient des commentaires TODO détaillés qui vous guideront étape par étape tout au long de l'implémentation.

Aide-mémoire

L'ordre de résolution des méthodes (MRO - Method Resolution Order) est la séquence que Python utilise pour rechercher des méthodes lorsque plusieurs classes possèdent le même nom de méthode.

Vérifiez le MRO en utilisant __mro__ ou mro() :

class A:
    def method(self):
        return "Method from A"

class B:
    def method(self):
        return "Method from B"

class C(A, B):
    pass

print(C.__mro__)
print(C.mro())  # Même résultat sous forme de liste

Python recherche les méthodes dans l'ordre du MRO - d'abord la classe elle-même, puis les classes parentes de gauche à droite, telles qu'elles sont listées dans la définition de la classe :

c = C()
print(c.method())  # "Method from A" - A vient avant B

class D(B, A):  # B vient avant A maintenant
    pass

d = D()
print(d.method())  # "Method from B" - B vient avant A

Essayez vous-même

# TODO: Importer toutes les classes requises
# from device import Device
# from screen import Screen
# from computer import Computer
# from laptop import Laptop

def explain_mro(class_name):
    # TODO: Afficher le MRO (Method Resolution Order) pour la classe donnée
    # TODO: Format : "MRO for [class name]:" (note : AUCUN espace après les deux-points)
    # TODO: Utiliser class_name.__name__ pour obtenir le nom de la classe
    # TODO: Utiliser class_name.__mro__ pour obtenir le tuple MRO
    # TODO: Afficher chaque nom de classe du MRO sur des lignes séparées
    
    # TODO: Créer une instance de la classe
    # TODO: Appeler power_on() sur l'instance et stocker le résultat
    # TODO: Afficher : "Power on result: [result]"
    # TODO: Afficher une ligne vide pour une meilleure lisibilité
    pass


# Testez votre code
# TODO: Appeler explain_mro() avec chaque classe : Device, Screen, Computer, et Laptop
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming