So, as JJ Hakala commented on what Python really does, call this:
type(a).__call__(a)
as such, if I want to override the __call__ method, I have to override the __call__ class, but if I don't want to influence the behavior of other instances of the same class, I need to create a new class using the overriden __call__ method.
So, an example __call__ override would look like this:
class A(object): def test(self): return "TEST" def __call__(self): return "EXAMPLE" def patch_call(instance, func): class _(type(instance)): def __call__(self, *arg, **kwarg): return func(*arg, **kwarg) instance.__class__ = _ a = A() print("call method: {0}".format(a.__call__)) print("test method: {0}".format(a.test)) patch_call(a, lambda : "example") a.test = lambda : "test" print("call method: {0}".format(a.__call__)) print("test method: {0}".format(a.test)) print("{0}".format(a())) print("Explicit a.__call__: {0}".format(a.__call__())) print("{0}".format(a.test())) print("Check instance of a: {0}".format(isinstance(a, A)))
Running it produces the following output:
call method: <bound method A.__call__ of <__main__.A object at 0x7f404217a5f8>> test method: <bound method A.test of <__main__.A object at 0x7f404217a5f8>> call method: <bound method patch_call.<locals>._.__call__ of <__main__.patch_call.<locals>._ object at 0x7f404217a5f8>> test method: <function <lambda> at 0x7f404216d048> example Explicit a.__call__: example test Check instance of a: True
source share