Menu
Coddy logo textTech

Ordre de résolution des méthodes

Fait partie de la section Programmation orientée objet du Journey Python de Coddy. Leçon 21 sur 64.

L’ordre de résolution des méthodes (MRO) est la séquence que Python utilise pour rechercher des méthodes lorsque plusieurs classes possèdent 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 objet intégrée (object).

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

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

Affichage :

Method from A

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

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 vient avant A dans la liste d'héritage. Vous pouvez accéder à des classes spécifiques dans l'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())

Alors que mro() et __mro__ fournissent la même séquence de classes, ils diffèrent par leur type : __mro__ renvoie un tuple, tandis que mro() renvoie une liste.

Point clé : Python recherche les méthodes dans l’ordre de MRO : d’abord la classe elle-même (index 0), puis les classes parentes de gauche à droite, comme elles sont listé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émenter la classe de base Device
  • screen.py : implémenter la classe Screen qui hérite de Device
  • computer.py : implémenter la classe Computer qui hérite de Device
  • laptop.py : implémenter la classe Laptop avec un héritage multiple
  • driver.py - implémenter 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 pas à pas dans l'implémentation.

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 : PAS d'espace après le 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 dans le 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: Print: "Power on result: [result]"
    # TODO: Affiche une ligne vide pour une meilleure lisibilité
    pass


# Testez votre code
# TODO: Appelez 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 Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Python en ligne