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

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

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

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

2023-02-03 25
Передача декоратором аргументов в функцию 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)

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


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

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

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

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...



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

0.016 с.