текст перекладу
Декоратор — це функція, яка приймає іншу функцію як аргумент, додає деяку функціональність і повертає іншу функцію без зміни вихідного коду оригінальної функції. Вони дозволяють обгорнути функцію в іншу функцію, змінюючи її поведінку. Це в основному використовується для повторного використання коду.
Щоб краще зрозуміти, давайте розглянемо код:
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. Ми розглянемо їх у цьому документі:
- 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))
- 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)