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__むしろ、教育目的で、私が行ったように をオーバーライドしても、期待どおりに機能しない理由を知りたいです。

4

1 に答える 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__ことは、行われる最も一般的な種類の呼び出しであるため、これはおそらく効率のためだと思います。

于 2013-08-13T02:13:54.340 に答える