Maison >développement back-end >Tutoriel Python >En quoi l'ordre de résolution de méthode (MRO) diffère-t-il entre les classes héritées et les classes de nouveau style en Python ?
Différences d'ordre de résolution de méthode (MRO) entre les classes héritées et les classes de nouveau style
Les classes de nouveau style en Python ont introduit un changement significatif dans le ordre de résolution de méthode (MRO) par rapport aux classes héritées. Bien que l'exemple fourni démontre correctement la résolution MRO pour les classes de nouveau style, examinons les différences subtiles qui distinguent les deux approches.
La différence clé apparaît lorsqu'une classe ancêtre apparaît plusieurs fois dans la profondeur "naïve". première ordonnance de résolution. Considérons le cas suivant :
class A: x = 'a' class B(A): pass class C(A): x = 'c' class D(B, C): pass
En utilisant les classes héritées, l'ordre de résolution serait : D - B - A - C - A. Dans cet ordre, A est rencontré en premier, ce qui entraîne le la définition de « x » étant masquée par la définition suivante en C.
D.x => 'a'
Cependant, les classes de nouveau style adoptent un MRO révisé :
D.__mro__ = (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
Cet ordre garantit que les classes ancêtres apparaissent une seule fois et après toutes leurs sous-classes. Par conséquent, les remplacements tels que la modification de « x » par C ont la priorité.
D.x => 'c'
En évitant les apparitions multiples de classes ancêtres dans l'ordre de résolution, cette approche élimine les ambiguïtés et garantit un comportement intuitif dans des hiérarchies d'héritage complexes. C'est pourquoi les classes à l'ancienne doivent généralement être évitées au profit des classes de nouveau style, en particulier lorsqu'il s'agit d'héritages multiples et de modèles de type losange.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!