Maison  >  Article  >  développement back-end  >  Pourquoi la reliure « super() » casse-t-elle votre code Python ?

Pourquoi la reliure « super() » casse-t-elle votre code Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 11:08:30853parcourir

 Why Does Rebinding `super()` Break Your Python Code?

Pourquoi la reliure de super() peut casser le code

Dans Python 3.x, la fonction super() peut être appelée sans arguments pour y accéder les méthodes de la superclasse. Ce comportement est activé par un tour de magie au moment de la compilation qui établit une connexion entre super() et la classe appelante. Cependant, si le super nom est renvoyé vers une variable différente (super_ dans l'exemple), cette connexion est rompue.

La raison en est le D.R.Y. (Ne vous répétez pas). Nommer explicitement la classe appelante dans les appels à la superclasse viole ce principe et augmente le risque de problèmes de liaison. De plus, l'utilisation de décorateurs de classe qui modifient le nom de la classe perturbe également la référence à l'objet de classe d'origine.

En créant une cellule class invisible dans une fermeture autour de la fonction contenant super(), le l'implémentation magique de super() évite ces problèmes. La cellule fait référence à l'objet de classe d'origine, garantissant que super() peut toujours accéder à la superclasse correcte, même si le super nom est rebond.

Bien que ce comportement puisse sembler surprenant, il est important de noter que super() est souvent mal utilisé. En simplifiant la syntaxe d'appel et en évitant les pièges de récursion infinie, l'implémentation mise à jour permet d'éviter les erreurs.

Si super est un rebond, le référencement de class dans la méthode restaure sa fonctionnalité. En effet, la cellule est créée lorsque super ou class est utilisé dans la méthode.

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