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 ?

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 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 05:49:02273parcourir

How Does Method Resolution Order (MRO) Differ Between Legacy and New-Style Classes in 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!

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