Maison > développement back-end > Tutoriel Python > Pouvez-vous remplacer les méthodes spéciales de Python directement sur les instances ?

Pouvez-vous remplacer les méthodes spéciales de Python directement sur les instances ?

Susan Sarandon
Libérer: 2024-11-30 04:04:10
original
189 Les gens l'ont consulté

Can You Override Python's Special Methods Directly on Instances?

Remplacement des méthodes spéciales sur les objets d'instance

En Python, les méthodes spéciales dont les noms sont entourés de doubles traits de soulignement ne sont généralement pas invoquées sur les instances mais plutôt sur leurs cours. Il s'agit d'un détail d'implémentation de CPython, l'interpréteur standard. Par conséquent, il n'est pas possible de remplacer __repr__() directement sur une instance et d'attendre que l'implémentation personnalisée soit utilisée.

Par exemple, considérons le code suivant :

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
print(a)   # Output: <__main__.A object at 0x0101C5D0>
print(repr(a))  # Output: '<__main__.A object at 0x0101C5D0>'
Copier après la connexion

Comme nous pouvons voyez, repr(a) ne donne pas le résultat attendu de "A."

Pour contourner cette limitation, il faut définir une nouvelle méthode qui appelle l'implémentation d'origine, comme suit :

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)
Copier après la connexion

Maintenant, vous pouvez remplacer __repr__() sur une instance en remplaçant _repr():

setattr(a, "_repr", MethodType(my_repr, a, a.__class__))
Copier après la connexion

où my_repr est l'implémentation personnalisée souhaitée.

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!

source:php.cn
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