Llamada de función y el atributo __call__
Callables de Python son objetos que tienen un__call__
método. Son la mayoría de las funciones de tiempo, pero también pueden ser instancias de clase.
Pero sucede que las funciones tienen un__call__
método. Por lo tanto, un__call__
el método tiene un__call__
método también. La siguiente sesión REPL muestra que podemos encadenar__call__
s:
>>> print
<built-in function print>
>>> print.__call__
<method-wrapper '__call__' of builtin_function_or_method object at 0x0000025E2D597F78>
>>> print.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F631438>
>>> print.__call__.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F5F85F8>
>>> print.__call__.__call__.__call__.__call__
<method-wrapper '__call__' of method-wrapper object at 0x0000025E2F725DA0>
... y así. Sorprendentemente, todos estos métodos tienen direcciones diferentes. Además, todos tienen el mismo comportamiento:
>>> print("a")
a
>>> print.__call__("a")
a
>>> print.__call__.__call__("a")
a
>>> print.__call__.__call__.__call__("a")
Entonces, cuando escriboprint("a")
, ¿cómo se llama realmente? Lo esprint
oprint.__call__
? ¿Y si defino unFoo
clase con un__call__
¿método?
Además, ¿cómo es posible que cada__call__
el método tiene su propiodiferente __call__
¿método? ¿Podría ser que de hecho se crearon cuando intenté acceder a ellos?