Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Топ:
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Эволюция кровеносной системы позвоночных животных: Биологическая эволюция – необратимый процесс исторического развития живой природы...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
2023-02-03 | 26 |
5.00
из
|
Заказать работу |
|
|
НАЧАТЬ БЕСПЛАТНО LETPY.COM
Декораторы в Python и примеры их практического использования.
Итак, что же это такое? Для того, чтобы понять, как работают декораторы, в первую очередь следует вспомнить, что функции в python являются объектами, соответственно, их можно возвращать из другой функции или передавать в качестве аргумента. Также следует помнить, что функция в python может быть определена и внутри другой функции.
Вспомнив это, можно смело переходить к декораторам. Декораторы — это, по сути, "обёртки", которые дают нам возможность изменить поведение функции, не изменяя её код.
Создадимсвойдекоратор " вручную ":
>>>
>>>def my_shiny_new_decorator(function_to_decorate):
... # Внутри себя декоратор определяет функцию-"обёртку". Она будет обёрнута вокруг декорируемой,
... # получая возможность исполнять произвольный код до и после неё.
... def the_wrapper_around_the_original_function():
... print("Я - код, который отработает до вызова функции")
... function_to_decorate() # Самафункция
... print("А я - код, срабатывающий после")
... # Вернёмэтуфункцию
... return the_wrapper_around_the_original_function
...
>>> # Представим теперь, что у нас есть функция, которую мы не планируем больше трогать.
>>>def stand_alone_function():
... print("Я простая одинокая функция, ты ведь не посмеешь меня изменять?")
...
>>> stand_alone_function()
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
>>> # Однако, чтобы изменить её поведение, мы можем декорировать её, то есть просто передать декоратору,
>>> # который обернет исходную функцию в любой код, который нам потребуется, и вернёт новую,
>>> # готовуюкиспользованиюфункцию :
>>> stand_alone_function_decorated = my_shiny_new_decorator(stand_alone_function)
|
>>> stand_alone_function_decorated()
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
А я - код, срабатывающий после
Наверное, теперь мы бы хотели, чтобы каждый раз, во время вызова stand_alone_function, вместо неё вызывалась stand_alone_function_decorated. Дляэтогопростоперезапишем stand_alone_function:
>>>
>>> stand_alone_function = my_shiny_new_decorator(stand_alone_function)
>>> stand_alone_function()
Я - код, который отработает до вызова функции
Я простая одинокая функция, ты ведь не посмеешь меня изменять?
А я - код, срабатывающий после
Собственно, это и есть декораторы. Вот так можно было записать предыдущий пример, используя синтаксис декораторов:
>>>
>>> @my_shiny_new_decorator
... def another_stand_alone_function():
... print("Оставь меня в покое")
...
>>> another_stand_alone_function()
Я - код, который отработает до вызова функции
Оставь меня в покое
А я - код, срабатывающий после
То есть, декораторы в python — это просто синтаксический сахар для конструкций вида:
another_stand_alone_function = my_shiny_new_decorator(another_stand_alone_function)
При этом, естественно, можно использовать несколько декораторов для одной функции, например так:
>>>
>>>def bread(func):
... def wrapper():
Print()
Func()
... print("<\______/>")
Return wrapper
...
>>>def ingredients(func):
... def wrapper():
... print("# помидоры #")
Func()
... print("~ салат ~")
Return wrapper
...
>>>def sandwich(food="-- ветчина --"):
... print(food)
...
>>> sandwich()
-- ветчина --
>>> sandwich = bread(ingredients(sandwich))
>>> sandwich()
#помидоры#
--ветчина--
~салат~
<\______/>
И используя синтаксис декораторов:
>>>
>>> @bread
... @ingredients
... def sandwich(food="-- ветчина --"):
... print(food)
...
>>> sandwich()
# помидоры #
-- ветчина --
~салат~
<\______/>
Также нужно помнить о том, что важен порядок декорирования. Сравните с предыдущим примером:
>>>
>>> @ingredients
... @bread
... def sandwich(food="-- ветчина --"):
... print(food)
...
>>> sandwich()
# помидоры #
-- ветчина --
<\______/>
~салат~
|
|
|
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!