Передача декоратором аргументов в функцию — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Передача декоратором аргументов в функцию

2023-02-03 34
Передача декоратором аргументов в функцию 0.00 из 5.00 0 оценок
Заказать работу

Однако, все декораторы, которые мы рассматривали, не имели одного очень важного функционала — передачи аргументов декорируемой функции. Собственно , этотоженесложносделать .

>>>

>>>def a_decorator_passing_arguments(function_to_decorate):

... def a_wrapper_accepting_arguments(arg1, arg2):

... print("Смотри, что я получил:", arg1, arg2)

... function_to_decorate(arg1, arg2)

... return a_wrapper_accepting_arguments

...

>>> # Теперь, когда мы вызываем функцию, которую возвращает декоратор, мы вызываем её "обёртку",

>>> # передаём ей аргументы и уже в свою очередь она передаёт их декорируемой функции

>>> @a_decorator_passing_arguments

... def print_full_name(first_name, last_name):

... print(" Менязовут ", first_name, last_name)

...

>>> print_full_name("Vasya", "Pupkin")

Смотри, что я получил: VasyaPupkin

Меня зовут VasyaPupkin

Декорирование методов

Один из важных фактов, которые следует понимать, заключается в том, что функции и методы в Python — это практически одно и то же, за исключением того, что методы всегда ожидают первым параметром ссылку на сам объект (self). Это значит, что мы можем создавать декораторы для методов точно так же, как и для функций, просто не забывая про self.

>>>

>>>def method_friendly_decorator(method_to_decorate):

... def wrapper(self, lie):

... lie -= 3

... return method_to_decorate(self, lie)

Return wrapper

...

>>>classLucy :

... def __init__(self):

... self.age = 32

... @method_friendly_decorator

... def sayYourAge(self, lie):

... print(" Мне {} лет , атыбысколькодал ?".format(self.age + lie))

...

>>> l = Lucy()

>>> l.sayYourAge(-3)

Мне 26 лет, а ты бы сколько дал?

Конечно, если мы создаём максимально общий декоратор и хотим, чтобы его можно было применить к любой функции или методу, то можно воспользоваться распаковкой аргументов:

>>>

>>>def a_decorator_passing_arbitrary_arguments(function_to_decorate):

... # Данная "обёртка" принимает любые аргументы

... def a_wrapper_accepting_arbitrary_arguments(*args, **kwargs):

... print("Передали ли мне что-нибудь?:")

Print(args)

Print(kwargs)

... function_to_decorate(*args, **kwargs)

... return a_wrapper_accepting_arbitrary_arguments

...

>>> @a_decorator_passing_arbitrary_arguments

... def function_with_no_argument():

... print("Python is cool, no argument here.")

...

>>> function_with_no_argument()

Передали ли мне что-нибудь?:

()

{}

Python is cool, no argument here.

>>> @a_decorator_passing_arbitrary_arguments

... def function_with_arguments(a, b, c):

... print(a, b, c)

...

>>> function_with_arguments(1, 2, 3)

Передали ли мне что-нибудь?:

(1, 2, 3)

{}

1 2 3

>>> @a_decorator_passing_arbitrary_arguments

... def function_with_named_arguments(a, b, c, platypus=" Почемунет ?"):

... print("Любят ли{}, {}и {} утконосов? {} ".format(a, b, c, platypus))

...

>>> function_with_named_arguments(" Билл ", " Линус ", " Стив ", platypus=" Определенно !")

Передали ли мне что-нибудь?:

('Билл', 'Линус', 'Стив')

{'platypus':'Определенно!'}

Любят ли Билл, Линус и Стив утконосов? Определенно !

>>>classMary (object):

... def __init__(self):

... self.age = 31

... @a_decorator_passing_arbitrary_arguments

... def sayYourAge(self, lie=-3): # Теперь мы можем указать значение по умолчанию

... print("Мне {} лет, а ты бы сколько дал?".format(self.age + lie))

...

>>> m = Mary()

>>> m.sayYourAge()

Передали ли мне что-нибудь?:

(<__main__.Mary object at 0x7f6373017780>,)

{}

Мне 28 лет, а ты бы сколько дал?

Декораторы с аргументами

А теперь попробуем написать декоратор, принимающий аргументы:

>>>

>>>def decorator_maker():

... print(" Ясоздаюдекораторы ! Я буду вызван только раз: когда ты попросишь меня создать декоратор.")

... def my_decorator(func):

... print(" Я - декоратор ! Я буду вызван только раз: в момент декорирования функции.")

... def wrapped():

... print ("Я - обёртка вокруг декорируемой функции.\n"

...                    "Я буду вызвана каждый раз, когда ты вызываешь декорируемую функцию.\n"

...                    "Я возвращаю результат работы декорируемой функции.")

Return func()

... print("Я возвращаю обёрнутую функцию.")

Return wrapped

... print("Я возвращаю декоратор.")

... return my_decorator

...

>>> # Давайте теперь создадим декоратор. Это всего лишь ещё один вызов функции

>>> new_decorator = decorator_maker()

Ясоздаюдекораторы ! Я буду вызван только раз: когда ты попросишь меня создать декоратор.

Я возвращаю декоратор.

>>>

>>> # Теперь декорируем функцию

>>>def decorated_function():

... print(" Я - декорируемаяфункция .")

...

>>> decorated_function = new_decorator(decorated_function)

Я - декоратор! Я буду вызван только раз: в момент декорирования функции.


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

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



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

0.006 с.