Как можно применять несколько декораторов к одной функции?

Применить несколько декораторов к одной функции можно последовательно, один за другим. Каждый декоратор оборачивает результат предыдущего. Это можно сделать двумя способами:

1. Синтаксический сахар (наиболее распространенный способ):
  
  @decorator1
  @decorator2
  def my_function():
      pass
  
  
В этом случае, `my_function` сначала будет декорирована `decorator2`, а затем `decorator1`.

2. Явное применение:
  
  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>.

Важно помнить: порядок декораторов имеет значение, так как каждый декоратор получает на вход результат работы предыдущего.

0