Python порядок выполнения множества декоратора


decorator_a DEF (FUNC):
Печать 'в Get decorator_a'
DEF inner_a (* аргументах, ** kwargs):
Печать 'в ГЭТ inner_a'
возврата в меню FUNC (* арг, ** kwargs)
возвращение inner_a

DEF decorator_b (FUNC):
Печать «ГЭТ decorator_b в '
DEF inner_b (* арг, ** kwargs):
Печать' в 'Получить inner_b
возврата в меню FUNC (* арг ** kwargs)
вернуться inner_b

@decorator_b
@decorator_a
DEF F (X):
Печать' в ГЭТ F '
возвращения X 2 *

F (. 1)
выполняет код , приведенный выше, конечный результат исполнения является:

Получить в decorator_a
Получить в decorator_b
Получить в inner_b
Получить в inner_a
Получить в е

С помощью нашего анализа, почему (поток выполнения в процессе проверки программы можно наблюдать через точку останова функцию путь) в этом порядке.

Прежде всего:

1, функция декоратор выполняется сразу же после того, как хорошо декоративное определение функции.

Мы выпустили последнюю строку кода Примечание:

# F (1)
повторного запуска, вы найдете окончательные результаты реализации следующим образом :

Получить в decorator_a
Получить в decorator_b
 

Описание Функция декоратора выполняются сразу после определения функции является хорошим украшением. И начиная порядок выполнения от дна до декорирования. При вызове decorator_a, е украсили inner_a, при вызове decorator_b, е украсили inner_b.

<0x00000000038F15F8 функция inner_b в> проверяемой печати (F), в результате исполнения: Окончательные производительности.

Поэтому, как показано в коде последний выполняется, когда F (. 1), е стал inner_b, но взамен на inner_b FUNC, но в действительности для inner_a, inner_a FUNC F является конечной в возвращении.

Таким образом, окончательный вызов на заказ

inner_b ---> inner_a ---> е

Реализация результатов:

Получить в inner_b
Получить в inner_a
Получить в е

 

В практическом сценарии применения, когда мы используем вышеуказанные два способ, чтобы написать декоративный способ проверить, нет такого знака в @login_required, а затем проверить разрешения, когда достаточно времени @permision_allowed, мы используем следующий порядок украсить функции:

@login_required
@permision_allowed
Защиту е ()
# Есть что - то
возвращение
总结一下:

Когда множество декоратора декоративной функции, существует правило, мало для упаковки (украшение) на функции, выполненной сверху вниз.

рекомендация

отwww.cnblogs.com/hyhy904/p/10961996.html