Pourquoi le « super() » de Python 3.x a-t-il ce comportement « magique » et quand peut-il entraîner des erreurs ?

Barbara Streisand
Libérer: 2024-10-26 12:18:29
original
556 Les gens l'ont consulté

  Why Does Python 3.x's `super()` Have This

Pourquoi la fonction super() de Python 3.x peut effectuer de la magie

Dans Python 3.x, la fonction super() peut être invoquée sans arguments. Cela permet un appel de superclasse simplifié et amélioré, comme démontré ci-dessous :

<code class="python">class A(object):
    def x(self):
         print("Hey now")

class B(A):
    def x(self):
        super().x()

B().x()  # Outputs: "Hey now"</code>
Copier après la connexion

Cette fonctionnalité est obtenue grâce à la magie de la compilation, qui garantit que super() a accès à la superclasse correcte au moment de l'exécution. Cependant, ce comportement peut également conduire à des erreurs inattendues lorsque super() est renvoyé sous un nom différent, comme illustré ci-dessous :

<code class="python">super_ = super

class A(object):
    def x(self):
        print("No flipping")

class B(A):
    def x(self):
        super_().x()

B().x()  # Raises: RuntimeError: super(): __class__ cell not found</code>
Copier après la connexion

Dévoilement du fonctionnement interne de super()

La magie derrière super() réside dans une cellule class au moment de la compilation qui est créée lorsque super ou class est référencée dans une méthode. Cette cellule fournit à super() un accès à l'objet de classe d'origine, même si le nom de la classe a été rebondi.

Ce mécanisme de cellule class a été introduit pour éviter les erreurs causées par le nom explicite de la classe. lors de l'invocation de super() ou de l'utilisation de décorateurs de classe qui renvoient de nouveaux objets de classe. Cela évite également une mauvaise application de super(), comme les invocations utilisant super(type(self), self) ou super(self.__class__, self), qui peuvent conduire à une récursivité infinie.

Pratique Applications et pièges

Bien que la cellule class ajoute de la commodité, elle peut également conduire à un comportement inattendu dans certains scénarios. Par exemple, si super() est renvoyé vers un nom différent (par exemple, super_ comme indiqué précédemment) et que la méthode ne fait pas référence explicitement à class, l'appel super() échouera.

Un autre exemple où la connaissance du mécanisme sous-jacent peut être bénéfique est l’utilisation de décorateurs de classe. Si un décorateur renvoie un nouvel objet de classe, la cellule class continuera à faire référence à la classe d'origine, garantissant ainsi une invocation correcte de la superclasse.

Il convient de noter que la reliure d'autres fonctions, méthodes ou les classes en Python peuvent également conduire à un comportement inattendu. Cependant, super() est un exemple particulièrement remarquable en raison de son rôle central dans la programmation orientée objet.

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!