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):
passVé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 APython 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 BMaintenant, 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.
Défi
MoyenDans ce défi, vous allez implémenter une hiérarchie de classes.
Vous devrez modifier ces fichiers :
device.py: Implémentez la classe de baseDevicescreen.py: Implémentez la classeScreenqui hérite deDevicecomputer.py: Implémentez la classeComputerqui hérite deDevicelaptop.py: Implémentez la classeLaptopavec l'héritage multipledriver.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 listePython 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 AEssayez 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
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
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire