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 ?

Pourquoi le remplacement de __repr__` sur une instance ne fonctionne-t-il pas en Python et comment y parvenir efficacement ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-28 12:30:11603parcourir

Why Doesn't Overriding `__repr__` on an Instance Work in Python, and How Can It Be Effectively Achieved?

Remplacement des méthodes spéciales sur une instance

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!

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