Maison >développement back-end >Tutoriel Python >Pourquoi les méthodes Python se comportent-elles différemment en termes d'égalité de référence par rapport aux fonctions ?

Pourquoi les méthodes Python se comportent-elles différemment en termes d'égalité de référence par rapport aux fonctions ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 07:32:02499parcourir

 Why Do Python Methods Behave Differently in Reference Equality Compared to Functions?

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!

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