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()
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)
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__))
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!