Maison  >  Article  >  développement back-end  >  Pourquoi le MRO de ma nouvelle classe Python ne se comporte-t-il pas comme prévu ?

Pourquoi le MRO de ma nouvelle classe Python ne se comporte-t-il pas comme prévu ?

DDD
DDDoriginal
2024-11-03 22:42:02683parcourir

Why Does the MRO in My New-Style Python Class Not Behave as Expected?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn