Что такое функтор в Python

Ответ

Функтор (или вызываемый объект, 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().

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