Какие вызовы в Python не могут вызывать `__call__`?Python

Программы на Python
Anonymous
Какие вызовы в Python не могут вызывать `__call__`?

Сообщение Anonymous »


Ответ на мой вопрос может зависеть от интерпретатора кода, хотя я не уверен. Если да, то я был бы рад услышать о любом широко используемом интерпретаторе Python, особенно, возможно, о CPython.

Если я реализую метод __call__ для класса C, то вызов экземпляра c из C вызовет c.__call__, который затем может, в свою очередь, использовать свой собственный метод __call__. Однако ясно, что не каждый вызываемый объект c всегда использует c.__call__, когда он вызывается в цепочке вызовов, такой как рассмотренный.

В качестве примера: вызов вызываемого(!) объекта get := vars(cls)["__get__"], где cls — это класс types.WrapperDescriptorType не всегда может полагаться на get.__call__, поскольку get имеет тип cls, и то же самое call := vars(cls)["__call__"]! (Если бы для получения get.__call__ требовался get.__get__, то для его получения потребовался бы вызов get, например get( получить, получить, cls) в какой-то момент.

На самом деле get.__call__ будет получен не как call.__get__(get, cls), а, видимо, как get(call, get, cls)< /код>.)

Вопрос. Учитывая вызываемый объект c, как узнать, всегда ли его вызов опирается на c.__call__? Мне нужен способ, который будет работать для всех ближайших версий Python, при этом более надежный способ нужен сильнее.

Вернуться в «Python»