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
Libérer: 2024-11-28 12:30:11
original
688 Les gens l'ont consulté

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>'
Copier après la connexion

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)
Copier après la connexion

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 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