2013-08-13 5 views
5

は、私が所望の出力を達成するための別の方法で興味がない私がこれまでメソッドオブジェクトの__call__メソッドを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 

で働いているものです。むしろ、教育的な目的のために、私が行ったように__call__を上書きすることがなぜ私が期待するように機能しないのかを知りたいと思います。

+2

@SethMMorton: 'dir(f)'を実行して、それらがあることを確認してください。 – Tadeck

+2

関連:http://stackoverflow.com/questions/9707600/python-functions-the-the-call-attribute – Jared

答えて

4

これはcall_functionで、ceval.cに関数型の特殊な筐体に起因すると表示されます。

if (PyFunction_Check(func)) 
    x = fast_function(func, pp_stack, n, na, nk); 
else 
    x = do_call(func, pp_stack, na, nk); 

私は、これは通常の関数を呼び出すと、__call__属性を無視しているので、効率のためにおそらくあることを推測すると思いますこれまでに行われた最も一般的な呼び出しです。

+0

これはCPythonの公式リポジトリであるため、hg.python.orgを指すようにリンクを変更しました。 – unutbu

関連する問題