Python

Python декоратори

Python декоратори
В тази статия ще обсъдим Python Decorators.

Определение: Декораторът е модел на дизайн в Python. Това е функция, която приема друга функция като аргумент, добавя към нея някаква функционалност, без да я променя и връща друга функция.

Това се нарича използване на „(@)“ и се поставя преди дефиниране на функция, която искаме да декорираме.

синтаксис:

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

За да разберем декораторите, трябва да знаем следните понятия.
Функциите са първокласни обекти. Това означава, че функция може да бъде предадена като аргумент, може да бъде върната от друга функция, може да бъде присвоена на променлива, може да бъде дефинирана в друга функция. За по-добро разбиране вижте примерите по-долу.

  1. Функция може да бъде предадена като аргумент
    Пример:

    дефиниране (n):
    връщане n + 1
    def demo_funcall (функция):
    num = 5
    функция за връщане (num)
    demo_funcall (нарастване)

    Тук функцията за увеличаване се предава като аргумент

    пример1.py:

    Изход:

    >> пример на python1.py

  2. Функцията може да бъде върната от друга функция
    Пример:

    def wish ():
    def say_wish ():
    връщане "Честит рожден ден"
    върнете say_wish
    здравей = пожелание ()
    Здравейте()

    пример2.py:

    Изход:

    >> пример на python2.py

    Тук функцията say_wish се връща от функцията за желание

  3. Функцията може да бъде модифицирана и присвоена на променлива
    Пример:

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

    пример3.py:

    Изход:
    >> пример на python3.py

  4. Дефинирайте функция в друга функция
    Пример:

    def add (a, b):
    def sum2 (a, b):
    върнете a + b
    res = сума2 (a, b)
    връщане res
    добави (10,15)

    пример4.py:

    Изход:
    >> пример на python4.py

Закриване:

Python позволява вложена функция за достъп до външния обхват на заграждащата функция.

def поздрав (съобщение):
"Функция Enclosong"
def send_greeting ():
"Вложена функция"
печат (съобщение)
прати поздрави()
поздрав ("Добро утро")

пример5.py:

Изход:

>> пример на python5.py

След като разберем горните понятия сега, ще напишем пример за декоратор.

Пример 1: Тук ще украсим функцията за съобщения. Отпечатване на съобщението в **** без промяна на оригиналната функция, т.е.д., функция за съобщения.

#decorator start
def print_msg (функция):
def обвивка ():
функция ()
връщаща обвивка
#decorator край
def message ():
print („Това е първият пример за демонстриране на декоратор“)
здравей = print_msg (съобщение)
Здравейте()

пример6.py:

Изход:

>> пример на python6.py

В най-простата форма можем да поставим декоратор върху дефиницията на функцията и да извикаме функцията, както е показано по-долу:

Тук, какъвто и низ да искаме да декорираме вътре ***, използвайте този декоратор.

Изход:

Многократен декоратор:

Можем да имаме множество декоратори за една функция. Тук декораторът е нанесен в реда, който нарекохме.
синтаксис:
@ декоратор2
@ декоратор1
Определение на функцията

Тук ще се приложи 1-ви декоратор, след това 2-ри декоратор.

Предаване на аргументи на функции на декоратор:

Можем да предаваме аргументи на функцията обвивка. Аргументите, предадени на функцията, за която искаме да декорираме.

Пример:

def deco_wish (функция):
def обвивка (arg1, arg2):
print ('Предадените аргументи са', arg1, arg2)
print ('*********************')
функция (arg1, arg2)
print ('***********************')
връщаща обвивка
@deco_wish
def wish (a1, a2):
печат (a1, a2)
пожелание („Добро“, „Утро“)
пожелание („Добър“, „Следобед“)

пример7.py:

Изход:

>> пример на python7.py

Предава променлив брой аргументи на функцията декоратор:

Можем да предадем произволен брой аргументи, като използваме * args (аргументи без ключови думи като числа) и ** kwargs (аргументи на ключови думи като речник). И двете са позиционни аргументи и съхраняват аргументите в променливите args и kwargs.

Забележка: Тук можем да използваме всяко име вместо args и kwargs, но тези имена се препоръчват да се използват.

Пример:

def dec_var_args (функция):
def обвивка (* аргументи, ** 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 = 'Anand', lname = 'Math')

пример8.py:

Изход:

>> пример на python8.py

Пример 2: Да предположим, че имаме 2 функции
Функция1: Изчислете сумата от числа от дадения списък
Функция 2: Умножете всяко число по 2 и ги добавете към дадения списък с числа
Ако искаме да изчислим времето, необходимо на всеки за изпълнение, можем да го направим по 2 начина

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

Вижте кода по-долу, решен с помощта на декоратор:

#decorator start
exe_time_calc (func):
def обвивка (аргумент):
start_time = дата и час.Време за среща.сега()
func (аргумент)
end_time = дата и час.Време за среща.сега()
print ("Времето за изпълнение на функция" + func.__name__ + "е" + str (end_time - end_time))
връщаща обвивка
#decorator край
@exe_time_calc
def cal_avg (данни):
сума = 0
за i в данни:
сума + = i
print ("Средната стойност на даден списък с числа е", сума // len (данни))
@exe_time_calc
def mul_by_2 (данни):
сума = 0
за i в данни:
сума + = + (i * 2)
print ("Сумата на всички числа след умножаване по 2 е", сума)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

пример9.py:

Изход:

>> пример на python9.py

Горният декоратор може да се използва за изчисляване на времето за изпълнение на която и да е от функциите. Използвайки декоратор, можем да избегнем повтарящ се код, когато имаме изискване за изчисляване на времето за изпълнение, за да поставим декоратора над дефиницията на функцията.

Заключение:

Декораторите променят функционалността на функция / метод, без да променят оригиналния код на функцията, която се декорира. Използвайки това, можем да избегнем писането на повтарящ се код. Познаването на концепцията за декоратор ще ни направи силни в python. Можем да използваме декоратор в следните случаи:

Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...
Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...
Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...