Добавить в корзинуПозвонить
Найти в Дзене
Codder

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

Всем привет! В прошлой статье мы начали разбирать декораторы в python, изучили что такое декоратор, как его использовать и даже написали свой собственный декоратор. Сегодня, я собираюсь погрузиться еще глубже и показать всю мощь декораторов. В прошлой статье мы не затронули две важные темы: 1 - Декорирование методов класса Известно, что функция и метод в python это почти одно и тоже, разница лишь в том, что метод первым аргументом ожидает "self" - то есть ссылку на объект. В этом случае у нас есть два варианта как передать аргумент функции в декоратор. На изображении выше видим два декоратора, начнем с add_greeting_1 - мы передаем аргумент self чтобы была возможность декорировать метод, однако если мы захотим использовать этот декоратор для обычной функции то получим ошибку(. А как же писать универсальный декоратор ? Следующий декоратор - add_greeting_2. Он универсален, подойдет как для функций так и для методов класса. Рассмотрим более детально функцию обертку("wrapper"), она при

Всем привет! В прошлой статье мы начали разбирать декораторы в python, изучили что такое декоратор, как его использовать и даже написали свой собственный декоратор.

Сегодня, я собираюсь погрузиться еще глубже и показать всю мощь декораторов.

В прошлой статье мы не затронули две важные темы:

  1. декорирование методов класса
  2. декоратор с аргументами

1 - Декорирование методов класса

Известно, что функция и метод в python это почти одно и тоже, разница лишь в том, что метод первым аргументом ожидает "self" - то есть ссылку на объект.

В этом случае у нас есть два варианта как передать аргумент функции в декоратор.

-2

На изображении выше видим два декоратора, начнем с add_greeting_1 - мы передаем аргумент self чтобы была возможность декорировать метод, однако если мы захотим использовать этот декоратор для обычной функции то получим ошибку(.

А как же писать универсальный декоратор ?

Следующий декоратор - add_greeting_2. Он универсален, подойдет как для функций так и для методов класса. Рассмотрим более детально функцию обертку("wrapper"), она принимает два аргумента - "*args" и "**kwargs". Благодаря оператора "*" происходит распаковка аргументов, таким образом можно создавать универсальные декораторы.

ARGS & KWARGS
args - сокращение от arguments
kwargs - cокращение от keyword arguments
Однако , вся магия в звездочках, которые означают распаковку объекта. args и kwargs это лишь принятые названия, их можо заменить.
Пример c args
a = [1, 2]
print([*a, 3, 4, 5])
# Вывод - [1, 2, 3, 4, 5]
Пример c kwargs
def print_names(**names):
for specialization, name in names.items():
print(f'{specialization}: {name}')
print_names(engineer="Antony", musician="Alice", mechanic="Pavel")
# Вывод -
engineer: Antony
musician: Alice
mechanic: Pavel

2 - Декоратор с аргументами

Спойлер - сильных отличний нету, все предельно просто).

-3

Мы видим привычный нам декоратор, но теперь он обернут в функцию "decorator_maker", данная функция создает декоратор "add_greeting" и за счет этого мы можем передавать в нее любые аргументы, которые далее будут переданы в сам декоратор. Таким образом мы передаем аргумент, который будет определять знак припинания в конце приветсвия.

-4

На этом тема декораторов в python заканчивается. Декоратор это очень полезный иснтурмент в арсенале любого программиста, он совсем не сложен в написании и использовании.

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

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