Ось що ви повинні знати про ДЕКОРАТОРИ в Python (ЧАСТИНА 1)

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

Щоб краще зрозуміти, давайте розглянемо код:

def decorator_func(original_func):  
 def wrapper_func():  
 print("Це виконано перед функцією display через обгортку")  
 return original_func()  
 return wrapper_func  

def display():  
 print("ЦЕ ВИКОНАЛА ФУНКЦІЯ DISPLAY")  

decorator_display = decorator_func(display) #рядок 8 для пояснення нижче  
decorator_display()

В цьому коді, decorator_func(original_func) — це декоратор, який приймає original_func (в даному випадку display) як аргумент. Усередині decorator_func визначена функція wrapper_func, яка "обгортає" original_func. Функція wrapper_func додає поведінку (виводить повідомлення) перед викликом і поверненням результату від original_func().

У рядку 8, коли викликається decorator_func(display), він повертає wrapper_func, яка тепер обгортає функцію display. Змінна decorator_display вказує на цю обгорнуту версію. Коли викликається decorator_display(), спочатку виводиться повідомлення від wrapper_func, а потім викликається display().

Тепер більш простий та ефективний спосіб зробити це за допомогою методу функціональних декораторів:

def decorator_func(original_func):  
 def wrapper_func():  
 print("Це виконано перед функцією display через обгортку")  
 return original_func()  
 return wrapper_func  

@decorator_func  
def display():  
 print("ЦЕ ВИКОНАЛА ФУНКЦІЯ DISPLAY")  

display()

Використовуючи декоратор, decoratordisplay = decoratorfunc(display). Цей рядок коду спрощений. Отже, він просто розширив поведінку іншої функції.

Саме так функції працюють. Існують також вбудовані декоратори в Python. Ми розглянемо їх у цьому документі:

  1. staticmethod: Коли нам потрібна функціональність не для об'єкта, а для всієї класу, ми робимо метод статичним. Цей метод не може отримувати доступ або змінювати стан класу. Це використовується, коли нам не потрібен екземпляр класу.

Без використання статичного методу:

class Math:  
 def add(self,a , b):  
 return a + b  

maths = Math()  
print(maths.add(5,10)) #15

Використовуючи статичний метод:

class Math:  
 @staticmethod  
 def add(a, b):  
 return a + b  

print(Math.add(5, 10))
  1. classmethod: Це перетворює метод на метод класу. Тут він приймає клас (cls) як перший аргумент. Метод класу в Python — це метод, прив'язаний до класу, а не до екземпляра класу. Також методи класу прив'язані до класу, а не до екземпляра класу.
class MyClass:  
 class_variable = 0 # Атрибут класу  

 def __init__(self, instance_variable):  
 self.instance_variable = instance_variable # Атрибут екземпляра  

 @classmethod  
 def class_method(cls):  
 print(f"Це метод класу. Атрибут класу: {cls.class_variable}")  

 @classmethod  
 def change_class_variable(cls, value):  
 cls.class_variable = value # Змінює атрибут класу  


# Створюємо екземпляр  
obj = MyClass(10)  

# Викликаємо метод класу через клас або екземпляр  
MyClass.class_method() # Виводить: Це метод класу. Атрибут класу: 0  
obj.class_method() # Виводить: Це метод класу. Атрибут класу: 0  

# Змінюємо атрибут класу за допомогою методу класу  
MyClass.change_class_variable(100)  
MyClass.class_method() # Виводить: Це метод класу. Атрибут класу: 100




Перекладено з: [This is what you must know about DECORATORS in Python (PART 1)](https://medium.com/@shovitkafle/this-is-what-you-must-know-about-decorators-in-python-part-1-b9a9ee516824)

Leave a Reply

Your email address will not be published. Required fields are marked *