Так что да, это означает, что они создаются по требованию и, следовательно, будут иметь уникальный идентификатор. В остальном они просто больше экземпляров одного типа.
вы Python - это объекты, которые имеют__call__
метод. Они в большинстве случаев являются функциями времени, но также могут быть экземплярами классов.
Но бывает так, что функции имеют__call__
метод. Следовательно,__call__
метод имеет__call__
метод также. Следующая сессия REPL показывает, что мы можем__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>
... и так далее. Примечательно, что все эти методы имеют разные адреса. Кроме того, они все имеют одинаковое поведение:
>>> print("a")
a
>>> print.__call__("a")
a
>>> print.__call__.__call__("a")
a
>>> print.__call__.__call__.__call__("a")
Итак, когда я пишуprint("a")
что на самом деле называется? Этоprint
, или жеprint.__call__
? А что если я определюFoo
класс с__call__
метод?
Кроме того, как это возможно, что каждый__call__
метод имеет свойразные __call__
метод? Может ли быть так, что они действительно были созданы, когда я пытался получить к ним доступ?