Maison  >  Article  >  développement back-end  >  Pourquoi le « super() » de Python 3.x a-t-il ce comportement « magique » et quand peut-il entraîner des erreurs ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 12:18:29549parcourir

  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>

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>

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!

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