5.1 Знакомство с декораторами
Декораторы — это функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию, изменяя или расширяя поведение исходной функции. Декораторы используются для повышения удобочитаемости и повторного использования кода.
Декораторы позволяют модифицировать поведение функций или методов без изменения их исходного кода. Поэтому они широко используются для добавления функциональности, логирования, контроля доступа и многих других задач.
Синтаксис декораторов в Python включает использование символа @ перед именем декоратора, который размещается перед определением функции.
@decorator
def my_function():
pass
Это эквивалентно следующему коду:
def my_function():
pass
my_function = decorator(my_function)
Подумайте внимательно, что тут происходит: мы объявляем функцию my_function, но потом подменяем ее функцией decorator, куда в качестве параметра передается наша функция. Функция decorator может вызвать нашу функцию по своему выбору.
5.2 Создание простого декоратора
Рассмотрим простой декоратор, который выводит сообщение перед и после вызова функции.
def my_decorator(func):
def wrapper():
print("Перед вызовом функции")
func()
print("После вызова функции")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Объяснение
Декоратор (my_decorator): Эта функция принимает функцию func в качестве аргумента и возвращает новую функцию wrapper, которая вызывает func и добавляет дополнительное поведение до и после ее вызова.
Функция с декоратором (say_hello): Функция say_hello обернута декоратором my_decorator, что добавляет дополнительное поведение при ее вызове.
Вывод:
# Перед вызовом функции
Hello!
# После вызова функции
5.3 Декораторы с аргументами
Декораторы могут принимать аргументы, что позволяет гибко настраивать их поведение.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
Объяснение
Декоратор с аргументами (repeat): Эта функция принимает аргумент num_times и возвращает декоратор decorator_repeat.
Декоратор (decorator_repeat): Этот декоратор принимает функцию func и возвращает новую функцию wrapper, которая вызывает func num_times раз.
Функция с декоратором (say_hello): Функция say_hello вызывается трижды благодаря декоратору repeat.
Вывод:
Hello, Alice!
Hello, Alice!
Hello, Alice!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ