Определение: декоратор - это шаблон проектирования в Python. Это функция, которая принимает другую функцию в качестве аргумента, добавляет к ней некоторые функции, не изменяя ее, и возвращает другую функцию.
Это вызывается с помощью «(@)» и помещается перед определением функции, которую мы хотим украсить.
синтаксис:
@ имя декоратора
Определение функции
Чтобы понять декораторы, нам нужно знать следующие концепции.
Функции - это первоклассные объекты. Это означает, что функция может быть передана как аргумент, может быть возвращена из другой функции, может быть назначена переменной, может быть определена в другой функции. Для лучшего понимания см. Примеры ниже.
- Функция может быть передана как аргумент
Бывший: def приращение (n):
вернуть n + 1
def demo_funcall (функция):
число = 5
функция возврата (число)
demo_funcall (приращение)Здесь функция приращения передана в качестве аргумента
example1.ру:
Выход:
>> python example1.ру
- Функция может быть возвращена из другой функции
Бывший: def желание ():
def say_wish ():
вернуть "С Днем Рождения"
вернуться say_wish
привет = желание ()
Привет()пример2.ру:
Выход:
>> python example2.ру
Здесь функция say_wish, возвращенная из функции wish - Функцию можно изменить и присвоить переменной
Бывший: def add (a, b):
вернуть a + b
sum2nos = add # Здесь функция add присвоена переменной
sum2nos (5,11)example3.ру:
Выход:
>> python example3.ру
- Определить функцию внутри другой функции
Бывший: def add (a, b):
def sum2 (a, b):
вернуть a + b
res = sum2 (a, b)
вернуть res
добавить (10,15)example4.ру:
Выход:
>> python example4.ру
Закрытие:
Python позволяет вложенной функции обращаться к внешней области включающей функции.
def приветствие (сообщение):"Функция Enclosong"
def send_greeting ():
«Вложенная функция»
печать (сообщение)
Послать приветствие()
приветствие («Доброе утро»)
example5.ру:
Выход:
>> python example5.ру
Разобравшись с вышеизложенными концепциями, мы напишем пример декоратора.
Пример 1: Здесь мы украсим функцию сообщения. Печать сообщения внутри **** без изменения исходной функции, i.е., функция сообщения.
#decorator startdef print_msg (функция):
def wrapper ():
функция ()
возвратная обертка
#decorator end
def сообщение ():
print («Это первый пример демонстрации декоратора»)
привет = print_msg (сообщение)
Привет()
example6.ру:
Выход:
>> python example6.ру
В простейшей форме мы можем разместить декоратор поверх определения функции и вызвать функцию, как показано ниже:
Здесь любую строку, которую мы хотим украсить внутри ***, используйте этот декоратор.
Выход:
Множественный декоратор:
У нас может быть несколько декораторов для одной функции. Здесь декоратор применяется в том порядке, в котором мы вызвали.
синтаксис:
@ decorator2
@ decorator1
Определение функции
Здесь будет применен 1-й декоратор, затем 2-й декоратор.
Передача аргументов в функции декоратора:
Мы можем передать аргументы функции-обертке. Аргументы, переданные функции, которую мы хотим украсить.
Бывший:
def deco_wish (функция):def обертка (arg1, arg2):
print ('Переданные аргументы:', arg1, arg2)
Распечатать ('*********************')
функция (arg1, arg2)
Распечатать ('*********************')
возвратная обертка
@deco_wish
def желание (a1, a2):
печать (a1, a2)
Wish ('Хорошо', 'Доброе утро')
Wish ('Хорошо', 'После полудня')
example7.ру:
Выход:
>> python example7.ру
Передайте переменное количество аргументов функции декоратора:
Мы можем передать любое количество аргументов, используя * args (аргументы без ключевых слов, такие как числа) и ** kwargs (аргументы ключевого слова, такие как словарь). Оба являются позиционными аргументами и хранят аргументы в переменных args и kwargs.
Примечание: здесь мы можем использовать любое имя вместо args и kwargs, но рекомендуется использовать эти имена.
Бывший:
def dec_var_args (функция):def оболочка (* args, ** kwargs):
print ('Аргументы, не являющиеся ключевыми словами:', args)
print ('Аргументы ключевого слова:', kwargs)
функция (* аргументы)
возвратная обертка
@ dec_var_args
def fun_non_key_args (* args):
для I в аргументах:
печать (я)
@ dec_var_args
def fun_key_args ():
print («Аргументы ключевого слова»)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Ананд', lname = 'Математика')
example8.ру:
Выход:
>> python example8.ру
Пример 2: Предположим, у нас есть 2 функции
Функция1: вычислить сумму чисел из данного списка
Функция 2: умножьте каждое число на 2 и добавьте их к заданному списку чисел
Если мы хотим рассчитать время, затрачиваемое каждым на выполнение, можно сделать это двумя способами
- Поместите код между временем начала и временем окончания в каждой функции
- Напишите декоратор для расчета времени
См. Ниже код, решенный с помощью декоратора:
#decorator startexe_time_calc (функция):
def обертка (аргумент):
start_time = datetime.дата и время.сейчас()
функция (аргумент)
end_time = datetime.дата и время.сейчас()
print («Время, затрачиваемое на выполнение функции» + func.__name__ + "is" + str (end_time - end_time))
возвратная обертка
#decorator end
@exe_time_calc
def cal_avg (данные):
сумма = 0
для i в данных:
сумма + = я
print ("Среднее значение данного списка чисел равно", sum // len (data))
@exe_time_calc
def mul_by_2 (данные):
сумма = 0
для i в данных:
сумма + = + (я * 2)
print ("Сумма всех чисел после умножения на 2 равна", sum)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
example9.ру:
Выход:
>> python example9.ру
Вышеупомянутый декоратор можно использовать для расчета времени выполнения любой из функций. Используя декоратор, мы можем избежать повторения кода, когда у нас есть требование для расчета времени выполнения, чтобы разместить декоратор над определением функции.
Заключение:
Декораторы изменяют функциональность функции / метода без изменения исходного кода декорируемой функции. Используя это, мы можем избежать написания повторяющегося кода. Знание концепции декоратора сделает нас сильными в Python. Мы можем использовать декоратор в следующих случаях:
- Авторизация в фреймворках Python Пример: Flask и Django
- логирование
- Измерьте время выполнения