Maison >développement back-end >Tutoriel Python >Comment « super() » fonctionne-t-il comme par magie dans Python 3.x sans aucun argument ?

Comment « super() » fonctionne-t-il comme par magie dans Python 3.x sans aucun argument ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 02:12:30281parcourir

 How Does `super()` Work Its Magic in Python 3.x Without Any Arguments?

Super() Magic dans Python 3.x

Dans Python 3.x, la fonction super() possède une capacité unique : elle peut être invoqué sans aucun argument. Ce comportement, bien qu'initialement surprenant, découle d'un choix de conception délibéré introduit pour résoudre un piège de programmation courant.

Éviter les violations DRY et l'ambiguïté des noms de classe

Avant Python 3 .x, un nom explicite de la classe était requis lors de l'appel de super(), comme le montre l'extrait de code suivant :

<code class="python">class Foo(Bar):
    def baz(self):
        return super(Foo, self).baz() + 42</code>

Cependant, cette approche violait le principe DRY et était sensible à l'ambiguïté du nom de classe causée par Reliure globale ou décorateurs de classe. Pour atténuer ces problèmes, Python 3.x a introduit une implémentation magique de super().

Exploiter une cellule Class pour la résolution d'exécution

Le l'implémentation actuelle de super() utilise une cellule class. Cette cellule donne accès à l'objet de classe d'origine, permettant à super() de résoudre la superclasse au moment de l'exécution sans avoir besoin d'un nom de classe explicite. En conséquence, le code suivant fonctionne comme prévu, même si Foo est réaffecté :

<code class="python">class Foo(Bar):
    def baz(self):
        return super().baz() + 42

Spam = Foo
Foo = something_else()

Spam().baz()  # still works</code>

Détails du compromis et de l'implémentation

Initialement, super() a été proposé comme un mot-clé, mais les inquiétudes quant à sa perception comme « trop magique » ont conduit à la mise en œuvre actuelle. Guido van Rossum lui-même a reconnu l'ambiguïté potentielle de l'utilisation d'un nom différent pour super().

Inconvénients potentiels

Bien que le comportement magique de super() soit généralement bénéfique, cela peut conduire à des résultats inattendus si la superclasse est modifiée dynamiquement ou si super() est renommé. Dans de tels scénarios, il est conseillé de référencer explicitement la variable class dans la méthode pour garantir une fonctionnalité correcte.

Exemples alternatifs de fonctions impactées par le changement de nom

Les autres fonctions et méthodes Python qui peuvent être affectées par le changement de nom incluent :

  • type()
  • isinstance()
  • issubclass()
  • property()
  • classmethod()
  • staticmethod()

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