Пример простого декоратора:
    
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 раза.Результат выполнения кода:
Привет, Иван!
Привет, Иван!
Привет, Иван!
    Декораторы широко используются для логирования, профилирования, проверки прав доступа и других задач, которые необходимо выполнять до или после вызова функции.