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

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

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

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

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

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

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

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

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

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

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

 

PythonLearn

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *