如何在Python中覆盖方法对象的__call__方法?

Joh*_*ohn 5 python

这是我到目前为止正在使用的内容

def f(n):
    return n

f.__call__ = lambda n: n + 1

print f(2) #I expect an output of 3 but get an output of 2
Run Code Online (Sandbox Code Playgroud)

我对实现所需输出的另一种方式不感兴趣.相反,出于教育目的,我想知道为什么压倒__call__我所做的,并不像我期望的那样工作.

Owe*_*wen 5

这似乎是由于功能类型的特殊壳体ceval.c,在call_function

if (PyFunction_Check(func))
    x = fast_function(func, pp_stack, n, na, nk);
else
    x = do_call(func, pp_stack, na, nk);
Run Code Online (Sandbox Code Playgroud)

我猜这可能是为了提高效率,因为调用常规函数并忽略该__call__属性是迄今为止最常见的调用类型。