Мне кажется, что я не могу использовать обезьянный патч класса __call__
(и да, я хочу исправлять только отдельные экземпляры, но не все).Как обезглавить патч `__call__`?
Следующий код:
class A(object):
def test(self):
return "TEST"
def __call__(self):
return "EXAMPLE"
a = A()
print("call method: {0}".format(a.__call__))
print("test method: {0}".format(a.test))
a.__call__ = lambda : "example"
a.test = lambda : "test"
print("call method: {0}".format(a.__call__))
print("test method: {0}".format(a.test))
print(a())
print("Explicit call: {0}".format(a.__call__()))
print(a.test())
Выходы это:
call method: <bound method A.__call__ of <__main__.A object at 0x7f3f2d60b6a0>>
test method: <bound method A.test of <__main__.A object at 0x7f3f2d60b6a0>>
call method: <function <lambda> at 0x7f3f2ef4ef28>
test method: <function <lambda> at 0x7f3f2d5f8f28>
EXAMPLE
Explicit call: example
test
В то время как я хотел бы его к выходу:
...
example
Explicit call: example
test
Как monkeypatch __call__()
? Почему я не могу исправить его так же, как я исправляю другие методы?
Хотя this answer рассказывает, как это сделать (предположительно, я не проверял еще), это не объясняет, почему часть вопроса.
Не могли бы вы сделать разницу в 2-символьный между выходами немного больше очевидно? Я смотрел в течение трех минут, пытаясь разглядеть разницу, но мозг большинства людей делает автокоррекцию небольшими ошибками. – cat
@cat: конечно, сделано –
[Специальный поиск метода] (https://docs.python.org/3/reference/datamodel.html#special-lookup) – GingerPlusPlus