Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-10-29 04:59:29859parcourir

 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

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)

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
  • Les méthodes dans les classes 不同的 sont toujours des objets différents :

    What.meth is Other.meth  # False

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)

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