2013-08-13 13 views
5

Ecco quello che sto lavorando con finoraCome sovrascrivere il metodo __call__ di un metodo metodo in 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 

io non sono interessato a un altro modo per ottenere il risultato desiderato. Piuttosto, per scopi didattici, vorrei sapere perché ignorare lo __call__ come ho fatto, non funziona come mi aspetto.

+2

@SethMMorton: prova ad eseguire 'dir (f)' per vedere che ce l'hanno. – Tadeck

+2

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

risposta

4

Questo sembra essere dovuto alla speciale involucro di tipi di funzioni in ceval.c, in call_function:

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

Direi che questo è probabilmente per l'efficienza, perché richiamare funzioni regolari, e ignorando l'attributo __call__ , è di gran lunga il tipo di chiamata più comune che viene fatto.

+0

Ho cambiato il link in modo che punti a hg.python.org poiché questo è il repository ufficiale per CPython ora . – unutbu

Problemi correlati