Substituindo métodos especiais em uma instância
Espero que alguém possa responder isso que tenha um bom entendimento profundo do Python :)
Considere o seguinte código:
<code>>>> class A(object): ... pass ... >>> def __repr__(self): ... return "A" ... >>> from types import MethodType >>> a = A() >>> a <__main__.A object at 0x00AC6990> >>> repr(a) '<__main__.A object at 0x00AC6990>' >>> setattr(a, "__repr__", MethodType(__repr__, a, a.__class__)) >>> a <__main__.A object at 0x00AC6990> >>> repr(a) '<__main__.A object at 0x00AC6990>' >>> </code>
Observe como repr (a) não produz o resultado esperado de "A"? Eu quero saber porque este é o caso e se há uma maneira de conseguir isso ...
Eu contraste, o seguinte exemplo funciona no entanto (Talvez porque não estamos tentando substituir um método especial?):
<code>>>> class A(object): ... def foo(self): ... return "foo" ... >>> def bar(self): ... return "bar" ... >>> from types import MethodType >>> a = A() >>> a.foo() 'foo' >>> setattr(a, "foo", MethodType(bar, a, a.__class__)) >>> a.foo() 'bar' >>> </code>