08 января 2018 29 января 2018 Python | решать тесты
Что такое декоратор?
Можно ли использовать декоратор для?
Во время развития функционала любого приложения появляется необходимость дополнить или изменить поведение ранее созданных функций. Например, вы разработали вычисление некоторых функций для себя, но c изменением круга пользователей программе уже не достаточно просто вычислять значения, появляется необходимость вести учёт правильным или неправильным вычислениям или проводить эти вычисления с учётом авторизации пользователя в системе и самым простым решением будет дополнить код функции дополнительным кодом. Но в результате вы получите пухлый, рыхлый и плохо управляемый программный код.
# начальная версия кода
def вычисление_значения(a, b):
return a+b
# код после добавления новых требований
def вычисление_значения(a, b):
if проверка_пользователя:
учёт_результатов
результат = a+b
учёт_результатов(результат)
печать_результатов(результат)
Более эфектным и эффективным будет поместить созданный ранее код внутрь другого кода, который будет предварять или завершать ваш код по новым задачам. И сделать это можно с помощью декораторов.
В программировании декоратор это обёртка функционального кода применяемая относительно другого функционального кода
Можно декорировать любой функциональный код
Можно использовать цепочки декораторов, подобно конфетам которые завёрнуты в фантики, упакованны в коробке и лежат в сумке
Декораторам можно передавать параметры для использования текущего контекста
Использование декораторов позволяет создавать более абстрактный и менее зависящий от контекста код.
Используя декораторы вы можете разделять ваш основной абстрактный код от кода контекста в разных файлах и даже модулях.
Вот так будет выглядеть необходимые нам декораторы
def проверка_пользователя(декорируемая_функция):
if пользователь.авторизован == True:
декорируемая_функция()
генерация исключения авторизации
def печать_результатов(декорируемая_функция):
печать( "шапка бланка печати" )
печать( декорируемая_функция() )
печать( "подвал бланка печати" )
def учёт_результатов(декорируемая_функция):
try:
декорируемая_функция()
журнал("положительное вычисление")
except:
журнал("неудачное вычисление")
Схематично использование декораторов можно представить в виде:
@проверка_пользователя
@печать_результатов_вычисление_значения
@учёт_результатов_вычисление_значения
def вычисление_значения(a, b):
return a+b
Функционально декораторы это простой функциональный код который запускается на этапе интерпретации и в качестве входных аргументов получив имя декорируемой функции (в даннам случае указатель на функцию) манипулирует аргументами и результатами декорируемой функции