Я надеюсь, что кто-то может ответить на это, у которого есть хорошее понимание Python:)
Рассмотрим следующий код:
>>> 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>'
>>>
Обратите внимание, что выражение (а) не дает ожидаемого результата "А"? Я хочу знать, почему это так, и если есть способ достичь этого...
Я контрастирую, следующий пример работает (возможно, потому что мы не пытаемся переопределить специальный метод?):
>>> 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'
>>>