Comment l'ordre de résolution de méthode (MRO) de Python garantit-il un héritage de méthode sans ambiguïté dans les classes de nouveau style ?

Barbara Streisand
Libérer: 2024-10-31 21:07:01
original
340 Les gens l'ont consulté

How does Python's Method Resolution Order (MRO) ensure unambiguous method inheritance in new-style classes?

Ordre de résolution de méthode (MRO) dans les classes de nouveau style

Dans le contexte de la programmation basée sur les classes de Python, l'ordre de résolution de méthode (MRO) ) définit la séquence dans laquelle les recherches de méthodes sont effectuées sur les instances d'une classe. La mise en œuvre du MRO diffère entre les classes de style ancien et celles de style nouveau.

Héritage des classes à l'ancienne

Dans les classes à l'ancienne, le MRO suit une approche approfondie. première approche. Lors de la recherche d'une méthode dans une instance d'une sous-classe, l'interpréteur parcourt la hiérarchie d'héritage de la sous-classe, en profondeur d'abord. La première occurrence de la méthode dans les classes de base est renvoyée.

Héritage de classe de nouveau style

Avec l'introduction de classes de nouveau style, la sémantique MRO est devenue C3 linéarisation. Cette approche élimine l'ambiguïté résultant de plusieurs occurrences de la même classe de base dans la hiérarchie d'héritage. Le MRO pour les classes de nouveau style est calculé comme suit :


  1. La classe feuille (sous-classe sans sous-classe) est placée dans le MRO.

  2. Toutes les classes de base sont ajoutées au MRO avant leurs sous-classes.

  3. Pour chaque classe de base du MRO, répétez récursivement les étapes 1 à 3 pour ses sous-classes.< /li>
  4. Si une classe de base apparaît plusieurs fois dans la hiérarchie, elle n'est incluse qu'une seule fois dans le MRO.

Exemple avec héritage multiple

Considérez l'exemple suivant impliquant un héritage multiple dans des classes de nouveau style :

<code class="python">class Base1(object):
    def amethod(self):
        print("Base1")

class Base2(Base1):
    pass

class Base3(object):
    def amethod(self):
        print("Base3")

class Derived(Base2, Base3):
    pass

instance = Derived()  
instance.amethod()  
print(Derived.__mro__) </code>
Copier après la connexion

Dans cet exemple, même si Base1 apparaît plusieurs fois dans l'héritage hiérarchie, le MRO pour Derived est :

(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
Copier après la connexion

Cet ordre correspond à l'algorithme de linéarisation C3 décrit ci-dessus. Puisque Derived est la classe feuille, elle est placée en premier dans le MRO. Ensuite, ses classes de base sont ajoutées : Base2 (une sous-classe de Base1) et Base3, dans cet ordre. Enfin, l'objet est ajouté en tant que classe de base ultime.

Conclusion

Le MRO pour les classes de nouveau style fournit une méthode déterministe et sans ambiguïté pour résoudre l'héritage de méthode. Cela élimine les ambiguïtés potentielles qui pourraient résulter de plusieurs occurrences de la même classe de base, comme c'était le cas avec l'héritage de classe à l'ancienne.

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!