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
Libérer: 2024-10-28 05:49:02
original
181 Les gens l'ont consulté

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

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

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!