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 esprintoprint.__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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta