Визначення: Декоратор - це шаблон дизайну в Python. Це функція, яка приймає іншу функцію як аргумент, додає до неї деяку функціональність, не змінюючи її, і повертає іншу функцію.
Це називається за допомогою “(@)” і розміщується перед визначенням функції, яку ми хочемо прикрасити.
синтаксис:
@decorator ім'я
Визначення функції
Для розуміння декораторів нам потрібно знати наведені нижче поняття.
Функції - це першокласні об’єкти. Це означає, що функція може бути передана як аргумент, може бути повернута з іншої функції, може бути призначена змінній, може бути визначена в іншій функції. Для кращого розуміння див. Наведені нижче приклади.
- Функція може бути передана як аргумент
Приклад: приріст def (n):
повернення n + 1
def demo_funcall (функція):
число = 5
функція повернення (число)
demo_funcall (збільшення)Тут функція приросту передається як аргумент
приклад1.py:
Вихід:
>> приклад python1.py
- Функцію можна повернути з іншої функції
Приклад: def wish ():
def say_wish ():
повернути "З днем народження"
повернути say_wish
привіт = побажання ()
Здравствуйте()приклад2.py:
Вихід:
>> приклад python2.py
Тут функція say_wish повернута з функції wish - Функцію можна змінювати і призначати змінній
Приклад: def add (a, b):
повернути a + b
sum2nos = add # Тут функція add призначена змінній
sum2nos (5,11)приклад3.py:
Вихід:
>> приклад python3.py
- Визначте функцію всередині іншої функції
Приклад: 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 startdef 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 і додайте їх до заданого списку чисел
Якщо ми хочемо розрахувати час, зайнятий кожним для виконання, можемо зробити це двома способами
- Розмістіть код між часом початку та закінчення кожної функції
- Напишіть декоратор для обчислення часу
Дивіться нижче код, вирішений за допомогою декоратора:
#decorator startexe_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. Ми можемо використовувати декоратор у нижченаведених випадках:
- Авторизація у фреймворках Python Приклад: Flask та Django
- Лісозаготівля
- Виміряйте час виконання