Maison > Article > développement back-end > Pourquoi le MRO de ma nouvelle classe Python ne se comporte-t-il pas comme prévu ?
MRO (Method Resolution Order) dans les classes de nouveau style
En Python, l'ordre de résolution de méthode (MRO) détermine la manière dont les méthodes sont résolues en cas d'héritage. Dans les classes de nouveau style, le MRO suit des règles spécifiques, comme expliqué dans la documentation de Python in a Nutshell (2e édition).
Dans l'exemple donné, le code utilise la syntaxe de classe de nouveau style, mais le MRO se comporte comme s’il s’agissait d’une classe à l’ancienne. Le MRO attendu pour les classes de nouveau style aurait dû placer Base3 avant Base1 pour corriger cet écart.
La principale différence entre MRO dans les classes de style ancien et de style nouveau réside dans la façon dont elles gèrent l'héritage multiple lorsque le même ancêtre la classe apparaît plusieurs fois. Dans les classes à l’ancienne, l’approche axée sur la profondeur pouvait conduire à une résolution incorrecte des méthodes. Cependant, dans les classes de style nouveau, le modèle d'héritage de diamant mentionné dans le livre est géré correctement.
Par exemple, considérons la hiérarchie d'héritage de diamant suivante :
<code class="python">class A(object): x = 'a' class B(A): pass class C(A): x = 'c' class D(B, C): pass</code>
Dans les classes de style ancien , le MRO serait D - B - A - C - A, ce qui ferait que la valeur de x dans D serait « a ». Cependant, dans les classes de nouveau style, le MRO est un objet D - B - C - A -, plaçant C avant A et permettant au remplacement de x dans C de prendre effet. Cela résout le problème d'héritage du diamant.
Par conséquent, le MRO correct pour l'exemple donné est l'objet Derived - Base2 - Base1 - Base3 -, mais le code actuel produit un résultat incorrect en raison du comportement ambigu du MRO. Pour remédier à cela, la syntaxe de la classe doit être mise à jour pour spécifier explicitement que les classes héritent de l'objet pour invoquer la sémantique MRO attendue.
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!