@my_decorator
def my_function():
    pass
    
def my_function():
    pass
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 – это внутренняя функция, которая содержит код, который будет выполняться до и после вызова декорируемой функции.
    @my_decorator над функцией say_hello эквивалентна записи say_hello = my_decorator(say_hello).  То есть, функция say_hello передается в my_decorator, а возвращенное значение (функция wrapper) присваивается переменной say_hello.
    Зачем использовать декораторы:
Примеры использования:
В заключение, декораторы – это мощный инструмент в Python, который позволяет улучшить читаемость, расширяемость и поддерживаемость кода. Понимание их принципов работы и вариантов использования является важным навыком для Python-разработчика.