如何在Python中重写方法对象的__call__方法?

5

以下是我目前正在处理的内容:

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

我对另一种达到所需输出的方法不感兴趣。相反,出于教育目的,我想知道为什么像我所做的那样覆盖__call__不起作用。


2
尝试执行 dir(f) 以查看它们是否拥有它。 - Tadeck
2
相关:https://dev59.com/6Gkw5IYBdhLWcg3ws8tj - Jared
1个回答

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);

我猜这可能是出于效率的考虑,因为调用常规函数并忽略__call__属性是最常见的调用方式。


我已将链接更改为hg.python.org,因为这是CPython的官方存储库。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接