tgoop.com/prog_way_blog/22
Create:
Last Update:
Last Update:
Python декораторы.
Как-то долго я ходил вокруг да около, а про любимый Python забыл. Сегодня попытаюсь объяснить вам что такое декораторы.
Декоратор - наверное, самый популярный паттерн, суть которого заключается в том, чтобы максимально быстро и просто расширить функционал исходной функции. Также стоит запомнить такое правило: декоратор - функция, которая в качестве аргумента принимает функцию и возвращает функцию. Давайте сразу к примеру:ᅠ
1. Определим функцию say_hello(name), которая на вход получит имя человека:
python2. Отлично. А теперь определим декоратор, который скажет что-то приятное после приветствия:
def say_hello(name):
print('Hello,', name)
say_hello('Денис')
>>> Hello, Денис
def you_are_beautiful(func): # На вход поступает функцияЕсть один нюанс, который нужно соблюсти - декоратор должен быть объявлен ДО декорируемой функции. А способов применить декоратор несколько, но для Python самый актуальный способ, так называемый «Синтаксический сахар», на примере:
def wrapped(*args, **kwargs): # обрабатываем аргументы
func(*args, **kwargs) # вызывает функцию извне
print('Классно выглядишь сегодня ;)')
return wrapped # возвращает функцию, но не вызывает!!!
# (возвращает ссылку на функцию, без скобок)
# сначала определяем декораторПод коробкой вызов функции выглядит так:
def you_are_beautiful(func):
def wrapped(*args, **kwargs):
func(*args, **kwargs)
print('Классно выглядишь сегодня ;)')
return wrapped
# далее определяем функцию и навешиваем декоратор
@you_are_beautiful <-- наш декоратор
def say_hello(name):
print('Hello,', name)
say_hello('Денис')
>>> Hello, Денис
>>> Классно выглядишь сегодня ;)
you_are_beautiful(say_hello('Денис'))Ну и, соответственно, декораторов может быть навешано несколько:
@decorator1По итогу получаем задекорированную функцию. Что-то выполнилось до вызова функции, что-то после, и это очень удобно в некоторых задачах. Обещаю сделать отдельный репозиторий/папку для своих декораторов, прикреплю ссылку сюда позже, а отдельным постом оповещу. И спасибо за прочтение, это важно дня меня 🙃
@decorator2
@decorator3
@decorator4
def foo():
pass
# что при вызове, по сути, эквивалентно этому:
decorator1(decorator2(decorator3(decorator4(foo()))))
#python #github
BY progway — программирование, IT

Share with your friend now:
tgoop.com/prog_way_blog/22