@ над определением функции, которую нужно декорировать.
  
@my_decorator
def my_function():
    print("Hello!")
  my_function = my_decorator(my_function).
Декораторы в Python предоставляют мощный способ модификации или расширения функциональности функций или методов без прямого изменения их кода. Они позволяют добавить функциональность "вокруг" существующей функции, например, логирование, проверку прав доступа, кэширование и т.д.
Основной принцип использования: Декоратор - это функция, которая принимает другую функцию в качестве аргумента, добавляет ей некоторое поведение, и возвращает новую, модифицированную функцию.
Синтаксис:  Синтаксически декоратор обозначается символом @, расположенным непосредственно перед определением функции, которую нужно декорировать.  Имя, следующее за @, - это имя функции-декоратора.
Пример:
def my_decorator(func):
    def wrapper():
        print("До выполнения функции.")
        func()
        print("После выполнения функции.")
    return wrapper
@my_decorator
def say_hello():
    print("Привет!")
say_hello()
    Разъяснение примера:
my_decorator - это функция-декоратор. Она принимает функцию func в качестве аргумента.wrapper - это внутренняя функция, определенная внутри декоратора. Она содержит дополнительную логику (вывод текста до и после выполнения).wrapper вызывается исходная функция func().my_decorator возвращает функцию wrapper.@my_decorator перед определением say_hello эквивалентна say_hello = my_decorator(say_hello).  То есть, функция say_hello передается в декоратор my_decorator, который возвращает новую, "обернутую" функцию, которая присваивается переменной say_hello.say_hello(), на самом деле вызывается wrapper(),  которая выводит "До выполнения функции.", затем вызывает исходную say_hello() (выводит "Привет!"), а затем выводит "После выполнения функции.".Декораторы с аргументами: Если функция, которую нужно декорировать, принимает аргументы, их нужно передать в wrapper, используя *args и **kwargs:
def my_decorator_with_args(func):
    def wrapper(*args, **kwargs):
        print("До выполнения функции с аргументами.")
        result = func(*args, **kwargs)
        print("После выполнения функции с аргументами.")
        return result
    return wrapper
@my_decorator_with_args
def add(x, y):
    return x + y
result = add(5, 3)
print(result)
    Преимущества использования декораторов: