Dévoilement de l'énigme : l'égalité de référence de méthode en Python
Dans le domaine de la programmation Python, le concept d'égalité de référence peut être à la fois séduisant et embarrassant. Étonnamment, les méthodes, contrairement aux fonctions régulières, présentent un comportement unique lorsqu'il s'agit d'égalité de référence.
Pourquoi cette différence frappante ? La réponse réside dans la manière dont les méthodes sont créées et invoquées. Contrairement aux fonctions, qui existent indépendamment dans la portée globale, les méthodes sont générées dynamiquement à chaque accès. Cela découle du rôle des fonctions en tant que descripteurs en Python. Lorsque la méthode .__get__ d'une fonction est appelée, un objet méthode est renvoyé.
Considérez l'exemple suivant :
<code class="python">class What: def meth(self): pass print(What.meth is What.meth) # This is False in Python 2 print(inst.meth is inst.meth) # False</code>
Le code ci-dessus affichera False pour les deux scénarios. En effet, chaque accès à What.meth entraîne la création d’un nouvel objet méthode. Par conséquent, ces objets de méthode ne peuvent pas être considérés comme égaux à une référence.
En revanche, les fonctions régulières sont des entités globales, donc lorsque func est appelée, elle fait toujours référence au même objet. Cela explique que le vrai résultat de func soit func.
Cependant, Python 3.8 a introduit une amélioration significative. Désormais, deux méthodes sont considérées comme égales si leurs attributs .__self__ et .__func__ sont des objets identiques. Cela signifie que si deux méthodes enveloppent la même fonction et sont liées à la même instance, elles compareront True en utilisant ==.
Pour les versions Python antérieures à 3.8, le comportement de la méthode == était incohérent. Les méthodes Python et un type de méthode C ont comparé soi pour l'égalité, tandis qu'un autre type de méthode C a comparé soi par identité.
Pour tester si deux méthodes représentent la même chose fonction sous-jacente, il est recommandé de comparer leurs attributs func :
<code class="python">print(What.meth == What.meth) # functions (or unbound methods in Python 2) print(What().meth == What().meth) # bound methods with *different* instances print(What().meth.__func__ == What().meth.__func__) # functions</code>
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!