2012-03-14 17 views
11

Estoy usando Python 2.7.2. Quiero entender la relación entre llamar a una función y llamar al atributo __call__ de la función. Por ejemplo, considere el siguiente códigoFunciones de Python y su atributo __call__

def foo(): 
    return 5 
print foo()   # ==> 5 
print foo.__call__() # ==> 5 

foo.__call__ = lambda : 6 
print foo()   # ==> 5 
print foo.__call__() # ==> 6 

Las primeras cuatro líneas parecen indicar la llamada a la función foo es lo mismo que llamar el atributo __call__ de foo. Sin embargo, las últimas tres líneas parecen indicar que son bestias diferentes ya que cambié el atributo __call__ pero no cambió el valor devuelto por una llamada al foo().

¿Alguien puede explicar la relación entre llamar al foo() y llamar al foo.__call__()? ¿Hay alguna manera de modificar el comportamiento de la función para que foo() así como foo.__call__() ahora devuelva 6 en lugar de 5?

+0

Nunca hay una razón para modificar 'foo .__ call__' - ¡podría simplemente modificar' foo' en su lugar! – katrielalex

+0

sin embargo, es un comportamiento extraño. buena pregunta –

Respuesta

11

Te recomiendo que leas special method lookup for new-style classes (especialmente el último párrafo).

Para las clases de nuevo estilo, las invocaciones de métodos implícitos especiales están sólo se garantiza que funcione correctamente si se ha definido en el tipo de un objeto, no en el diccionario de la instancia del objeto.

+2

Debería explicar cómo el hecho de que trabajemos aquí con una función realmente no importa, ya que las funciones son objetos y hay una clase a la que pertenecen (''), etc. ... –

Cuestiones relacionadas