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

DDD
Libérer: 2024-11-03 22:42:02
original
685 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal