Python

Декоратори Python

Декоратори Python
У цій статті ми будемо обговорювати декоратори Python.

Визначення: Декоратор - це шаблон дизайну в Python. Це функція, яка приймає іншу функцію як аргумент, додає до неї деяку функціональність, не змінюючи її, і повертає іншу функцію.

Це називається за допомогою “(@)” і розміщується перед визначенням функції, яку ми хочемо прикрасити.

синтаксис:

@decorator ім'я
Визначення функції

Для розуміння декораторів нам потрібно знати наведені нижче поняття.
Функції - це першокласні об’єкти. Це означає, що функція може бути передана як аргумент, може бути повернута з іншої функції, може бути призначена змінній, може бути визначена в іншій функції. Для кращого розуміння див. Наведені нижче приклади.

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

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

    Тут функція приросту передається як аргумент

    приклад1.py:

    Вихід:

    >> приклад python1.py

  2. Функцію можна повернути з іншої функції
    Приклад:

    def wish ():
    def say_wish ():
    повернути "З днем ​​народження"
    повернути say_wish
    привіт = побажання ()
    Здравствуйте()

    приклад2.py:

    Вихід:

    >> приклад python2.py

    Тут функція say_wish повернута з функції 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 = sum2 (a, b)
    повернути відп
    додати (10,15)

    приклад4.py:

    Вихід:
    >> приклад python4.py

Закриття:

Python дозволяє вкладеній функції отримувати доступ до зовнішньої області функції, що включає.

привітання def (повідомлення):
"Функція Enclosong"
def send_greeting ():
"Вкладена функція"
друк (повідомлення)
надіслати привітання()
привітання ("Доброго ранку")

приклад5.py:

Вихід:

>> приклад python5.py

Зрозумівши вищезазначені поняття, ми напишемо приклад декоратора.

Приклад 1: Тут ми прикрасимо функцію повідомлення. Друк повідомлення всередині **** без зміни початкової функції, тобто.e., функція повідомлення.

#decorator start
def print_msg (функція):
оболонка def ():
функція ()
зворотна обгортка
#decorator end
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)
wish ('Добре', 'Ранок')
wish ('Добрий', 'Полудень')

приклад7.py:

Вихід:

>> приклад python7.py

Передати змінну кількість аргументів функції декоратора:

Ми можемо передавати будь-яку кількість аргументів, використовуючи * 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 = 'Anand', lname = 'Math')

приклад8.py:

Вихід:

>> приклад python8.py

Приклад 2: Припустимо, у нас є 2 функції
Функція1: Обчисліть суму чисел із поданого списку
Функція2: Помножте кожне число на 2 і додайте їх до заданого списку чисел
Якщо ми хочемо розрахувати час, зайнятий кожним для виконання, можемо зробити це двома способами

  1. Розмістіть код між часом початку та закінчення кожної функції
  2. Напишіть декоратор для обчислення часу

Дивіться нижче код, вирішений за допомогою декоратора:

#decorator start
exe_time_calc (func):
оболонка def (arg):
start_time = дата-час.дата, час.зараз ()
func (arg)
end_time = дата-час.дата, час.зараз ()
print ("Час, необхідний для виконання функції" + функц.__name__ + "є" + str (end_time - end_time))
зворотна обгортка
#decorator end
@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. Ми можемо використовувати декоратор у нижченаведених випадках:

Як розробити гру на Linux
Десять років тому не так багато користувачів Linux передбачали, що їх улюблена операційна система колись стане популярною ігровою платформою для комер...
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...
Кращі ігри командного рядка для Linux
Командний рядок - це не просто ваш найбільший союзник при використанні Linux, він також може бути джерелом розваг, оскільки ви можете використовувати ...