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 ?
É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!