【发布时间】:2016-11-27 05:13:04
【问题描述】:
我似乎无法修补类实例的 __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
我如何猴子补丁__call__()?为什么我不能像修补其他方法一样修补它?
虽然this answer 告诉了怎么做(据说我还没有测试过),但它并没有解释问题的为什么部分。
【问题讨论】:
-
您能否让输出之间的 2 个字符的区别更明显一些?我凝视了三分钟,试图找出差异,但大多数人的大脑会自动纠正小错误。
-
answer 告诉我们“a() 不调用 a.__call__。它调用 type(a).__call__(a)”
标签: python monkeypatching