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
Libérer: 2024-12-04 05:12:10
original
604 Les gens l'ont consulté

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

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

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

a = A()
setattr(a, "_repr", lambda self: "Overridden")
repr(a)
Copier après la connexion

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!

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