Что такое паттерн Delegate в Python и как его реализовать

Ответ

Делегат (Delegate) — это поведенческий паттерн проектирования, который позволяет объекту передать (делегировать) выполнение определенной задачи другому, отдельному объекту-исполнителю.

В Python, в отличие от языков вроде C#, нет встроенного ключевого слова delegate. Однако этот паттерн легко реализуется благодаря тому, что функции являются объектами первого класса.

Основные способы реализации:

  1. Функции как объекты. Самый простой способ — передать одну функцию в качестве аргумента другой.

    def greeter(name):
        return f"Hello, {name}!"
    
    def execute_delegate(func, arg):
        # Выполнение делегировано функции 'func'
        return func(arg)
    
    # Передаем функцию greeter как делегат
    result = execute_delegate(greeter, "Alice")
    print(result) # Вывод: Hello, Alice!
  2. Классы с методом __call__. Объект класса можно сделать вызываемым, как функцию, что позволяет хранить состояние.

    class Adder:
        def __init__(self, value_to_add):
            self.value = value_to_add
    
        def __call__(self, x):
            # Логика делегирована этому методу
            return self.value + x
    
    # add_five - это вызываемый объект-делегат
    add_five = Adder(5)
    result = add_five(10)
    print(result) # Вывод: 15

Зачем это нужно?

  • Разделение ответственностей: Основной код не знает о деталях реализации делегата.
  • Гибкость: Позволяет легко менять поведение на лету, подставляя разные реализации делегата.
  • Переиспользование кода: Часто используется для реализации колбэков, обработчиков событий и паттерна "Стратегия".