Python

Декораторы Python

Декораторы Python
В этой статье мы собираемся обсудить декораторы Python.

Определение: декоратор - это шаблон проектирования в Python. Это функция, которая принимает другую функцию в качестве аргумента, добавляет к ней некоторые функции, не изменяя ее, и возвращает другую функцию.

Это вызывается с помощью «(@)» и помещается перед определением функции, которую мы хотим украсить.

синтаксис:

@ имя декоратора
Определение функции

Чтобы понять декораторы, нам нужно знать следующие концепции.
Функции - это первоклассные объекты. Это означает, что функция может быть передана как аргумент, может быть возвращена из другой функции, может быть назначена переменной, может быть определена в другой функции. Для лучшего понимания см. Примеры ниже.

  1. Функция может быть передана как аргумент
    Бывший:

    def приращение (n):
    вернуть n + 1
    def demo_funcall (функция):
    число = 5
    функция возврата (число)
    demo_funcall (приращение)

    Здесь функция приращения передана в качестве аргумента

    example1.ру:

    Выход:

    >> python example1.ру

  2. Функция может быть возвращена из другой функции
    Бывший:

    def желание ():
    def say_wish ():
    вернуть "С Днем Рождения"
    вернуться say_wish
    привет = желание ()
    Привет()

    пример2.ру:

    Выход:

    >> python example2.ру

    Здесь функция say_wish, возвращенная из функции wish

  3. Функцию можно изменить и присвоить переменной
    Бывший:

    def add (a, b):
    вернуть a + b
    sum2nos = add # Здесь функция add присвоена переменной
    sum2nos (5,11)

    example3.ру:

    Выход:
    >> python example3.ру

  4. Определить функцию внутри другой функции
    Бывший:

    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 start
def 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 и добавьте их к заданному списку чисел
Если мы хотим рассчитать время, затрачиваемое каждым на выполнение, можно сделать это двумя способами

  1. Поместите код между временем начала и временем окончания в каждой функции
  2. Напишите декоратор для расчета времени

См. Ниже код, решенный с помощью декоратора:

#decorator start
exe_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. Мы можем использовать декоратор в следующих случаях:

Как показать наложение OSD в полноэкранных приложениях и играх Linux
Игра в полноэкранные игры или использование приложений в полноэкранном режиме без отвлекающих факторов может отрезать вас от соответствующей системной...
Топ-5 карт для захвата игр
Все мы видели и любили потоковые игры на YouTube. PewDiePie, Jakesepticye и Markiplier - лишь некоторые из лучших игроков, которые заработали миллионы...
Как разработать игру в Linux
Десять лет назад не многие пользователи Linux могли бы предсказать, что их любимая операционная система однажды станет популярной игровой платформой д...