Maison > développement back-end > Tutoriel Python > Pourquoi ne puis-je pas remplacer les méthodes spéciales directement sur les instances Python ?

Pourquoi ne puis-je pas remplacer les méthodes spéciales directement sur les instances Python ?

Patricia Arquette
Libérer: 2024-11-28 22:14:11
original
804 Les gens l'ont consulté

Why Can't I Override Special Methods Directly on Python Instances?

Remplacer des méthodes spéciales sur une instance : une exploration

Imaginez une situation dans laquelle vous avez une instance d'une classe et vous désirez modifier sa des méthodes spéciales, telles que __repr__(). En essayant de remplacer ces méthodes, vous pouvez rencontrer un comportement inattendu.

Pour illustrer cela, considérez le code suivant :

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
Copier après la connexion

Lorsque vous appelez repr(a), vous vous attendez à obtenir "A ," étant donné que repr a été remplacé. Cependant, le résultat n'est pas celui attendu.

Cette divergence provient de l'approche de Python consistant à invoquer des méthodes spéciales. Généralement, Python exécute des méthodes spéciales uniquement sur la classe elle-même, et non sur ses instances. Par conséquent, écraser repr directement sur une instance est inefficace.

Pour surmonter cette limitation, envisagez l'approche suivante :

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

Dans ce code modifié, repr sur une instance peut être écrasé en remplaçant _repr().

En contrastant ce comportement avec ce qui suit L'extrait de code illustre la différence entre le remplacement des méthodes spéciales et des méthodes régulières :

class A(object):
    def foo(self):
        return "foo"

def bar(self):
    return "bar"

a = A()
setattr(a, "foo", MethodType(bar, a, a.__class__))
Copier après la connexion

Dans ce cas, la méthode spéciale foo a été remplacée avec succès sur l'instance. Cependant, il est crucial de noter que cette capacité est exclusive aux méthodes classiques.

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