Найти в Дзене
Codder

Python, Паттерн проектирования - Декоратор; Tutorial Часть 1

Всех приветствую!

Сегодня обсудим:

  1. что такое декоратор ?
  2. как использовать декоратор ?
  3. как написать свой декоратор ?

1 - Определние

Декоратор - обертка позволяющия изменять поведения функции не изменяя ее код

2 - Применение

Рассмотрим простой пример

-2

Функция "fetch_name" принимает аргумент "name" затем возвращает его , в нашем примере она возвращает имя "Кирилл". Теперь мы снова определяем эту же функцию и добавляем к ней декоратор 'add_greeting', как видите код функции совсем не изменился, но вывод функции стал другим, теперь она берет имя и добавляет к нему приветсвие.

💡 После аргумента name стоит ":" и тип данных "str", а после функции "->" и также тип данных "str".
ЧТО ЭТО ?
"name: str" - указывает, что аргумент "name" является строкой, то есть тип данных str.
"-> str " - указывает на тип возвращаемых функцией данных.
Как известно python язык с динамической типизацией, но возможность расставлять подсказки существует, это считается хорошей практикой на реальных проектах. Такой код лучшее читается и понимается другим разработчиком, следовательно его проще поддерживать.
Подсказки типов для python тема большая и довольно важная. Если кому то интересно - дайте знать в комментариях!

Интересно как это получилось ? Тогда бежим дальше!🏃🏼

3 - Практика

-3

Определяем декоратор "add_greeting" с аргументом "func", то есть аргумент эта функция, которую мы будем декорировать. Внутри декоратора определяется функция обертка - "wrapper" с аргументом "*args", это аргумент, который передается из функции fetch_name - "name". Далее вызываем функцию и записываем ее в переменную"name", вовзращаем строку и форматируем в нее переменную "name". И последним шагом возвращаем функцию wrapper.

Теперь воспользуемся синтаксическим сахаром и обернем функцию в декоратор - @add_greeting. Все.

💡 Что за синтаксический сахар ?
На самом деле, мы бы могли обернуть функции в декоратор следующим способом:
wrapped_func = add_greeting(fetch_name)
print(wrapped_func('Кирилл'))
Но, благодаря синтаксического сахара мы можем сократить эту запись как в примере выше, то есть используя "@".

Если что-то было непонятно - как всегда жду вопросы в комментариях!

Спасибо за внимание, надеюсь было интересно!