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.

Le Method Resolution Order (MRO) est la séquence utilisée par Python 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 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 en order MRO - la class elle-même first (index 0), puis les classes parentes de gauche à droite comme indiqué dans la définition de la class (indices 1, 2, etc.). La first method trouvée est utilisée.

challenge icon

Défi

Moyen

Dans ce défi, vous allez mettre en œuvre une hiérarchie de classes.

Vous devrez modifier ces fichiers :

  • device.py : Implement la class de base Device
  • screen.py : Implement la class Screen qui hérite de Device
  • computer.py : Implement la class Computer qui hérite de Device
  • laptop.py : Implement la class Laptop avec héritage multiple
  • driver.py - Implement les 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 tout au long de 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 Object Oriented Programming