Теория и практика. Быстрая проверка задач и подсказки к ошибкам на русском языке. Работает в любом современном браузере. — КиберПедия 

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Теория и практика. Быстрая проверка задач и подсказки к ошибкам на русском языке. Работает в любом современном браузере.

2023-02-03 25
Теория и практика. Быстрая проверка задач и подсказки к ошибкам на русском языке. Работает в любом современном браузере. 0.00 из 5.00 0 оценок
Заказать работу

НАЧАТЬ БЕСПЛАТНО 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()

# помидоры #

-- ветчина --

<\______/>

~салат~


Поделиться с друзьями:

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.014 с.