Maison >développement back-end >Tutoriel Python >Comment puis-je remplacer les méthodes spéciales sur une instance Python ?

Comment puis-je remplacer les méthodes spéciales sur une instance Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-04 05:12:10608parcourir

How Can I Override Special Methods on a Python Instance?

Remplacer une méthode spéciale sur une instance

En Python, un objectif commun pour les développeurs est de remplacer des méthodes spéciales sur une instance. Cependant, cela n'est généralement pas possible car les méthodes spéciales ne sont généralement appelées que sur la classe elle-même.

Problème :

Pour illustrer ce concept, considérons l'extrait de code suivant :

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
a
repr(a)
setattr(a, "__repr__", MethodType(__repr__, a, a.__class__))
a
repr(a)

Comme vu ci-dessus, remplacer __repr__ directement sur l'instance ne donne pas le résultat attendu. repr(a) renvoie la représentation de classe par défaut, pas la valeur de retour de la méthode remplacée.

Solution :

Pour obtenir le remplacement des méthodes spéciales sur une instance, vous pouvez utiliser un approche indirecte. Définissez la méthode spéciale comme un wrapper qui appelle une méthode interne remplacée :

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)

Maintenant, vous pouvez remplacer __repr__ sur une instance en écrasant _repr(). Par exemple :

a = A()
setattr(a, "_repr", lambda self: "Overridden")
repr(a)

Ce code mis à jour affichera la représentation sous forme de chaîne remplacé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!

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