Ответ
Функтор (или вызываемый объект, callable object) в Python — это любой объект, у которого реализован магический метод __call__()
. Это позволяет использовать экземпляр класса так, как если бы он был обычной функцией.
Основное преимущество функторов — возможность сохранять состояние между вызовами.
Пример:
Создадим функтор-счетчик, который будет увеличивать свое внутреннее значение при каждом вызове.
class Counter:
def __init__(self):
self.count = 0
print("Счетчик инициализирован")
def __call__(self, *args, **kwargs):
# Этот метод выполняется при вызове экземпляра как функции
self.count += 1
print(f"Вызов номер {self.count}")
# Создаем экземпляр класса
my_counter = Counter()
# Используем экземпляр как функцию
my_counter() # Выведет: Вызов номер 1
my_counter() # Выведет: Вызов номер 2
my_counter() # Выведет: Вызов номер 3
Ключевые преимущества:
- Состояние: Функтор — это объект, он может хранить данные в своих атрибутах (
self.count
) между вызовами. - Гибкость: Помимо
__call__
, класс может иметь и другие методы для настройки или получения данных. - Чистый синтаксис: Код
my_counter()
выглядит более естественно, чем, например,my_counter.execute()
.
Функторы часто используются при реализации декораторов с параметрами, в обработчиках событий или для создания объектов, имитирующих поведение функций, но с более сложной внутренней логикой.