Maison > développement back-end > Tutoriel Python > Pourquoi les méthodes Python ne sont-elles pas égales, même si elles font référence à la même fonction sous-jacente ?

Pourquoi les méthodes Python ne sont-elles pas égales, même si elles font référence à la même fonction sous-jacente ?

Barbara Streisand
Libérer: 2024-10-29 04:59:29
original
869 Les gens l'ont consulté

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

Égalité de référence de méthode en Python

En Python, les méthodes sont des objets uniques créés dynamiquement lors de l'accès. Ce comportement diffère de celui des fonctions régulières, qui sont référencées par le même objet quel que soit le moment où elles sont appelées.

Pour comprendre cela, considérons l'exemple suivant :

class What:
    def meth(self):
        pass
What().meth is What().meth  # False
Copier après la connexion

Dans ce code , les méthodes de méthamphétamine ne sont pas égales même si elles font référence à la même fonction sous-jacente. En effet, chaque objet méthamphétamine est une instance unique créée au moment de l'exécution.

La raison de ce comportement réside dans le processus de recherche d'attributs de Python, où un objet méthode est généré en appelant la méthode (fonction) .__get__ du descripteur :

What.__dict__['meth'].__get__(What(), What)
Copier après la connexion

Cette création dynamique d'objets méthode conduit aux observations suivantes :

  • Les instances d'une même classe ont des objets meth différents :

    inst = What()
    inst.meth is inst.meth  # False
    Copier après la connexion
  • Les méthodes dans les classes 不同的 sont toujours des objets différents :

    What.meth is Other.meth  # False
    Copier après la connexion

Avant Python 3.8, les tests l'égalité des méthodes utilisant == pourrait donner des résultats incohérents. Cependant, Python 3.8 et versions ultérieures permettent une comparaison d'égalité des méthodes en fonction de leurs attributs .___self__ et .___func__, si elles correspondent de manière identique.

En tant que bonne pratique, pour déterminer si deux méthodes représentent la même fonction sous-jacente, comparez leurs attributs .__func__ :

What.meth.__func__ == What.meth.__func__  # True
What().meth.__func__ == What().meth.__func__  # True (for same instance)
What().meth.__func__ == What(other_instance).meth.__func__  # False (for different instances)
Copier après la connexion

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