Всех приветствую!
Сегодня обсудим:
- что такое декоратор ?
- как использовать декоратор ?
- как написать свой декоратор ?
1 - Определние
Декоратор - обертка позволяющия изменять поведения функции не изменяя ее код
2 - Применение
Рассмотрим простой пример
Функция "fetch_name" принимает аргумент "name" затем возвращает его , в нашем примере она возвращает имя "Кирилл". Теперь мы снова определяем эту же функцию и добавляем к ней декоратор 'add_greeting', как видите код функции совсем не изменился, но вывод функции стал другим, теперь она берет имя и добавляет к нему приветсвие.
💡 После аргумента name стоит ":" и тип данных "str", а после функции "->" и также тип данных "str".
ЧТО ЭТО ?
"name: str" - указывает, что аргумент "name" является строкой, то есть тип данных str.
"-> str " - указывает на тип возвращаемых функцией данных.
Как известно python язык с динамической типизацией, но возможность расставлять подсказки существует, это считается хорошей практикой на реальных проектах. Такой код лучшее читается и понимается другим разработчиком, следовательно его проще поддерживать.
Подсказки типов для python тема большая и довольно важная. Если кому то интересно - дайте знать в комментариях!
Интересно как это получилось ? Тогда бежим дальше!🏃🏼
3 - Практика
Определяем декоратор "add_greeting" с аргументом "func", то есть аргумент эта функция, которую мы будем декорировать. Внутри декоратора определяется функция обертка - "wrapper" с аргументом "*args", это аргумент, который передается из функции fetch_name - "name". Далее вызываем функцию и записываем ее в переменную"name", вовзращаем строку и форматируем в нее переменную "name". И последним шагом возвращаем функцию wrapper.
Теперь воспользуемся синтаксическим сахаром и обернем функцию в декоратор - @add_greeting. Все.
💡 Что за синтаксический сахар ?
На самом деле, мы бы могли обернуть функции в декоратор следующим способом:
wrapped_func = add_greeting(fetch_name)
print(wrapped_func('Кирилл'))
Но, благодаря синтаксического сахара мы можем сократить эту запись как в примере выше, то есть используя "@".
Если что-то было непонятно - как всегда жду вопросы в комментариях!
Спасибо за внимание, надеюсь было интересно!