2013-08-13 13 views
5

Hier ist, was ich mit so viel arbeiteteWie überschreibe ich die Methode __call__ eines Methodenobjekts 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 

Ich bin nicht daran interessiert, in einer anderen Art und Weise die gewünschte Ausgabe zu erreichen. Für pädagogische Zwecke würde ich gerne wissen, warum das Überschreiben der __call__, wie ich es getan habe, nicht so funktioniert, wie ich es erwarte.

+2

@SethMMorton: Versuchen Sie 'dir (f)' auszuführen, um zu sehen, dass sie es haben. – Tadeck

+2

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

Antwort

4

Dies scheint Spezialgehäuse von Funktionstypen in ceval.c zurückzuführen zu sein, 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); 

Ich würde vermuten, dass dies wahrscheinlich für Effizienz, da reguläre Funktionen aufrufen, und ignorieren die __call__ Attribut , ist bei weitem die häufigste Art von Berufung, die getan wird.

+0

Ich habe den Link geändert, um auf hg.python.org zeigen, da dies jetzt das offizielle Repository für CPython ist . – unutbu

Verwandte Themen