Операция вызова: __call__ в Python

Метод __call__ вызывается при обращении к экземпляру как к функции. Это не повторяющееся определение – если метод __call__ присутствует, интерпретатор будет вызвать его, когда экземпляр вызывается как функция, передавая ему любые позиционные и именованные аргументы:

Выражаясь более формальным языком, метод __call__ поддерживает все схемы передачи аргументов. Все что передается экземпляру, передается этому методу наряду с обычным аргументом self, в котором передается сам экземпляр. Например, следующие определения метода:

соответствует следующим вызовам экземпляра:

Суть состоит в том, что классы и экземпляры, имеющие метод __call__, поддерживают тот же синтаксис и семантику передачи аргументов, что и обычные функции и методы.

Реализация операции вызова, как в данном примере, позволяет экземплярам классов имитировать поведение функций, а также сохранять информацию о состоянии между вызовами.

В следующим примере реализация метода __call__ может показаться ненужной. То же самое поведение можно реализовать с помощью простого метода:

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

Фактически этот метод занимает третье место среди наиболее часто используемых методов перезагрузки операторов – после конструктора __init__ и методов форматирования __str__ и __repr__.

Где выгодно купить просмотры ВК на записи и видео? И сколько они стоят? Когда высокая цена оправдана и обоснована? Почему без денег не всегда хорошо? Сайт https://pricesmm.com/ предлагает результаты анализа платных способов и цен на просмотры Вконтакте.

Для наших читателей хочу показать хороший пример где наглядно показывается удобность метода __call__. В следующем примере мы создали класс который определяет факториал использую кэш а также рекурсивность.

Проверяем работоспособность нашего класса:

 

PythonLearn