Пример простого декоратора:
def my_decorator(func):
def wrapper():
print("Что-то делается до вызова функции.")
func()
print("Что-то делается после вызова функции.")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
Описание: my_decorator
- функция, принимающая другую функцию (func
) и возвращающая новую функцию (wrapper
). wrapper
выполняет действия до и после вызова исходной функции. @my_decorator
- синтаксический сахар для say_hello = my_decorator(say_hello)
.
Декоратор в Python - это функция, которая принимает другую функцию в качестве аргумента, добавляет ей какую-либо функциональность и возвращает новую функцию. Это мощный инструмент для расширения поведения функций без их непосредственного изменения.
Вот простой пример декоратора:
<!-- Пример декоратора -->
def my_decorator(func):
def wrapper():
print("Что-то происходит перед вызовом функции.")
func()
print("Что-то происходит после вызова функции.")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
<!-- Конец примера -->
Разберем пример:
my_decorator(func)
: Это и есть наш декоратор. Он принимает функцию func
в качестве аргумента.wrapper()
: Это внутренняя функция, которую возвращает декоратор. Именно она добавляет новую функциональность.func()
: Внутри wrapper()
мы вызываем исходную функцию func()
. Это позволяет нам выполнить исходную функцию с добавленной логикой.return wrapper
: Декоратор возвращает функцию wrapper
.@my_decorator
: Синтаксис @my_decorator
над функцией say_hello
- это синтаксический сахар. Он эквивалентен say_hello = my_decorator(say_hello)
. То есть, мы передаем say_hello
в my_decorator
и результат (функцию wrapper
) присваиваем обратно say_hello
.Результат выполнения кода:
Что-то происходит перед вызовом функции.
Привет!
Что-то происходит после вызова функции.
Другой пример, декоратор с аргументами:
<!-- Пример декоратора с аргументами -->
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
value = func(*args, **kwargs)
return value
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet(name):
print(f"Привет, {name}!")
greet("Иван")
<!-- Конец примера -->
Разберем пример:
repeat(num_times)
: Это фабрика декораторов. Она принимает аргументы для настройки поведения декоратора.decorator_repeat(func)
: Это сам декоратор, он принимает функцию.wrapper(*args, **kwargs)
: Внутренняя функция, принимающая произвольное количество позиционных и именованных аргументов, необходимых для декорируемой функции.for
функция func
вызывается num_times
раз.@repeat(num_times=3)
: Декорируем функцию greet
, указав, что нужно повторить ее выполнение 3 раза.Результат выполнения кода:
Привет, Иван!
Привет, Иван!
Привет, Иван!
Декораторы широко используются для логирования, профилирования, проверки прав доступа и других задач, которые необходимо выполнять до или после вызова функции.