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

Patricia Arquette
Libérer: 2024-10-27 02:12:30
original
227 Les gens l'ont consulté

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

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

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!

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!