Что такое декораторы в Python и как они работают?
Приведите пример использования декоратора.
Выше ожиданий:
- Цепочки декораторов
- Фабрики декораторов
Декораторы — мощная фича в Python, которая позволяет изменять или расширять поведение функций или методов, не изменяя их фактический код. Они следуют паттерну декоратора и реализуются как функция, принимающая другую функцию в качестве входного значения и возвращающая изменённую версию.
Как работают декораторы
- Декоратор — это функция, которая принимает функцию в качестве аргумента
- Она определяет внутреннюю оберточную функцию, которая добавляет функциональность
- Оберточная функция вызывает исходную функцию
- Оберточная функция возвращается декоратором
Декораторы используют символ @
, размещённый над определениями функций:
@my_decorator
def my_function():
pass
Этот синтаксис эквивалентен:
def my_function():
pass
my_function = my_decorator(my_function)
Общие случаи применения
- Сбор логов: отслеживание вызовов функций
- Проверка аутентификации и авторизации
- Измерение времени выполнения функции
- Кэширование результатов
- Валидация входных данных
- Rate limiting
- Обработка ошибок
Цепочки декораторов
Несколько декораторов могут быть применены к одной функции в цепочке. Они выполняются в порядке от низу вверх:
@decorator1
@decorator2
def function():
pass
Выполнение происходит как: decorator1(decorator2(function))
Фабрики декораторов
Фабрика декораторов — это функция, которая возвращает настраиваемый декоратор. Это позволяет создавать декораторы, принимающие аргументы для настройки их поведения:
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello {name}")
Здесь repeat(3)
возвращает декоратор, который выполнит функцию 3 раза.