Вопрос №29
Осталось:
Что такое декораторы и как они работают?
Образцовый ответ
Показывать ответ по умолчанию
Декоратор — это функция, которая принимает другую функцию и возвращает новую, расширяя её поведение без изменения исходного кода.
Простой декоратор:
def log_call(func): def wrapper(*args, **kwargs): print(f"Вызов функции: {func.__name__}") result = func(*args, **kwargs) print(f"Результат: {result}") return result return wrapper @log_call def add(a, b): return a + b add(3, 5) # Вызов функции: add # Результат: 8
Как это работает:
# Запись с @decorator @log_call def add(a, b): return a + b # Эквивалентна def add(a, b): return a + b add = log_call(add)
Сохранение метаданных (@wraps):
from functools import wraps def log_call(func): @wraps(func) # Сохраняет имя и docstring оригинала def wrapper(*args, **kwargs): print(f"Вызов: {func.__name__}") return func(*args, **kwargs) return wrapper @log_call def add(a, b): """Складывает два числа.""" return a + b print(add.__name__) # add (без @wraps было бы wrapper) print(add.__doc__) # Складывает два числа.
Практические примеры декораторов:
- Логирование вызовов функций
- Замер времени выполнения
- Кеширование результатов
- Проверка прав доступа
- Валидация аргументов
