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
Защиту е ()
# Есть что - то
возвращение
总结一下:
Когда множество декоратора декоративной функции, существует правило, мало для упаковки (украшение) на функции, выполненной сверху вниз.