Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Топ:
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Однако, все декораторы, которые мы рассматривали, не имели одного очень важного функционала — передачи аргументов декорируемой функции. Собственно , этотоженесложносделать .
>>>
>>>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)
Я - декоратор! Я буду вызван только раз: в момент декорирования функции.
|
|
|
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!