@decorator1
  @decorator2
  def my_function():
      pass
  
  
  В этом случае, `my_function` сначала будет декорирована `decorator2`, а затем `decorator1`.
  
  
  def my_function():
      pass
  my_function = decorator1(decorator2(my_function))
  
  
  Этот способ эквивалентен использованию синтаксического сахара.
На Python можно применять несколько декораторов к одной функции, просто расположив их друг над другом, перед определением функции. Порядок применения декораторов важен: они применяются снизу вверх.
Синтаксис выглядит так:
@decorator1
@decorator2
def my_function(arg1, arg2):
    # Тело функции
    pass
  В этом примере, сначала будет применен decorator2 к функции my_function, а затем к результату применения decorator2 будет применен decorator1.
Это эквивалентно следующему коду:
def my_function(arg1, arg2):
    # Тело функции
    pass
my_function = decorator1(decorator2(my_function))
  Пример:
def bold(func):
    def wrapper(*args, **kwargs):
        return "<b>" + func(*args, **kwargs) + "</b>"
    return wrapper
def italic(func):
    def wrapper(*args, **kwargs):
        return "<i>" + func(*args, **kwargs) + "</i>"
    return wrapper
@bold
@italic
def get_message():
    return "Привет!"
print(get_message())  # Вывод: <b><i>Привет!</i></b>
  В этом примере italic применяется первым, оборачивая строку "Привет!" в теги <i> и </i>. Затем bold применяется к результату, оборачивая все в теги <b> и </b>.
Важно помнить: порядок декораторов имеет значение, так как каждый декоратор получает на вход результат работы предыдущего.