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):
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 objet intégrée (object).
Créez un objet et appelez la méthode :
c = C()
print(c.method())Affichage :
Method from APython 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 BMaintenant, 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.
Défi
MoyenDans ce défi, vous allez mettre en œuvre une hiérarchie de classes.
Vous devrez modifier ces fichiers :
device.py: Implement la class de baseDevicescreen.py: Implement la classScreenqui hérite deDevicecomputer.py: Implement la classComputerqui hérite deDevicelaptop.py: Implement la classLaptopavec héritage multipledriver.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
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