Как переопределить метод __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__ как я сделал, не работает, как я ожидаю.

По-видимому, это связано со специальным корпусом типов функций в 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__ – это, безусловно, самый распространенный вид вызова, который выполняется.