Паттерн: Декоратор (Wrapper)
1️⃣ Как кратко ответить
Паттерн "Декоратор" (или "Wrapper") — это структурный паттерн проектирования, который позволяет добавлять новую функциональность объектам динамически, без изменения их структуры. В Python декораторы часто используются для оборачивания функций, чтобы изменить или расширить их поведение, например, для логирования, проверки прав доступа или кэширования.
2️⃣ Подробное объяснение темы
Паттерн "Декоратор" — это один из структурных паттернов проектирования, который позволяет добавлять объектам новую функциональность, не изменяя их исходный код. Это достигается путем оборачивания объекта в другой объект, который добавляет нужное поведение.
Зачем это нужно?
Представьте, что у вас есть функция или класс, который выполняет определенную задачу. Со временем может возникнуть необходимость расширить его функциональность, например, добавить логирование, проверку прав доступа или кэширование результатов. Вместо того чтобы изменять исходный код, что может быть рискованно и не всегда возможно, вы можете использовать декоратор, чтобы "обернуть" существующую функциональность и добавить новое поведение.
Где применяется?
Декораторы широко используются в Python для:
- Логирования: Автоматическое ведение журнала вызовов функций.
- Проверки прав доступа: Проверка, имеет ли пользователь необходимые права для выполнения функции.
- Кэширования: Сохранение результатов функции для ускорения повторных вызовов.
- Изменения поведения: Например, для изменения формата вывода или обработки исключений.
Как работает?
Декоратор в Python — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, которая обычно вызывает оригинальную функцию, добавляя к ней дополнительное поведение.
Вот простой пример декоратора:
def my_decorator(func):
def wrapper():
print("Что-то делаем до вызова функции")
func()
print("Что-то делаем после вызова функции")
return wrapper
def say_hello():
print("Привет!")
decorated_function = my_decorator(say_hello)
decorated_function()
Вывод будет:
Что-то делаем до вызова функции
Привет!
Что-то делаем после вызова функции
В этом примере my_decorator — это декоратор, который оборачивает функцию say_hello, добавляя к ней дополнительное поведение до и после ее вызова.
Использование синтаксиса @
Python предоставляет удобный синтаксис для применения декораторов с помощью символа @. Это делает код более читаемым и понятным:
@my_decorator
def say_hello():
print("Привет!")
say_hello()
Этот код эквивалентен предыдущему примеру, но выглядит более элегантно и проще для понимания.
Практический пример: Логирование
Рассмотрим пример декоратора для логирования вызовов функции:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Вызов функции {func.__name__} с аргументами {args} и {kwargs}")
result = func(*args, **kwargs)
print(f"Функция {func.__name__} вернула {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(3, 5)
Вывод будет:
Вызов функции add с аргументами (3, 5) и {}
Функция add вернула 8
Этот декоратор логирует вызов функции add, включая переданные аргументы и возвращаемое значение.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться