【问题标题】:How do I override a method object's __call__ method in Python? [duplicate]如何在 Python 中覆盖方法对象的 __call__ 方法? [复制]
【发布时间】:2013-08-13 10:45:16
【问题描述】:

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

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__ 并没有像我预期的那样工作。

【问题讨论】:

标签: python


【解决方案1】:

这似乎是由于 ceval.ccall_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 的官方存储库。
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 2021-10-16
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2013-04-13
相关资源
最近更新 更多