Maison >développement back-end >Tutoriel Python >Pourquoi le remplacement de __repr__` sur une instance ne fonctionne-t-il pas en Python et comment y parvenir efficacement ?
Considérez l'extrait de code ci-dessous :
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A() print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>' setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) print(a) # <__main__.A object at 0x00AC6990> print(repr(a)) # '<__main__.A object at 0x00AC6990>'
Comme observé, la méthode personnalisée __repr__ n'est pas appelée l'instance a. Pour comprendre ce comportement, il est essentiel de noter que :
Dans CPython (l'interpréteur Python standard), les méthodes spéciales dont les noms sont entourés de __ ne sont généralement pas invoquées sur des instances mais plutôt sur des classes. Par conséquent, tenter de remplacer __repr__ directement sur une instance ne donnera pas le résultat attendu.
Pour contourner cette limitation, on peut utiliser la stratégie suivante :
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
Ici, __repr__ appelle une méthode d'assistance _repr, qui appelle ensuite l'implémentation __repr__ par défaut pour la classe d'objet. En remplaçant _repr, nous pouvons effectivement remplacer __repr__ sur une instance.
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!