Цей невеликий скрипт містить функцію log. яка приймає функцію як єдиний аргумент. Ми створюємо об'єкт логгер, а назва лог файлу таке ж, як і у функції. Після цього, функція log буде записувати, як наша функція була викликана і що вона повертає, якщо повертає.
вбудовані декоратори
Python містить кілька вбудованих декораторів. З усіх цих декораторів, найважливішою трійцею є:
Також існують декоратори в різних розділах стандартної бібліотеки Python. Одним із прикладів є functools.wraps. Ми зосередимося на трьох головних декораторів, зазначених вище.
@classmethod і @staticmethod
Я не користувався ними раніше, так що зробив невелике дослідження.
- декоратор <*@classmethod>* Може бути викликаний за допомогою екземпляра класу, або безпосередньо, через власний клас Python як перший аргумент. Відповідно до документації Python: він може бути викликаний як в класі (наприклад, C.f ()), або в екземплярі (наприклад, C (). F ()). Примірник ігнорується, за винятком його класу. Якщо метод класу викликаний для виведеного класу, то об'єкт виведеного класу передається в якості мається на увазі перший аргумент.
- Декоратор @classmethod. в першу чергу, використовується як чередуемих конструктор або допоміжний метод для ініціалізації.
- декоратор <*@staticmethod>* - це просто функція всередині класу. Ви можете викликати їх обох як з ініціалізацією класу так і без створення екземпляра класу. Зазвичай це застосовується в тих випадках, коли у вас є функція, яка, за вашим переконанням, має зв'язок з класом. Здебільшого, це вибір стилю.
Якщо ми поглянемо на приклад коду, в якому показано, як працює декоратор, це може допомогти зрозуміти основні принципи:
Цей приклад демонструє, що ви можете викликати звичайний метод і обидва методи декоратора одним і тим же шляхом. Зверніть увагу на те, що ви можете викликати обидві функції @classmethod і @staticmethod прямо з класу або з екземпляра класу. Якщо ви спробуєте викликати звичайну функцію за допомогою класу (іншими словами, DecoratorTest.doubler (2)), ви отримаєте помилку TypeError. Також варто звернути увагу на те, що останній оператор виведення показує, що decor.static_quad повертає звичайну функцію замість пов'язаного методу.
Властивості Python (@property)
Python містить дуже зручний невеликий концепт, під назвою property. який виконує кілька корисних завдань. Ми розглянемо, як робити наступне:
- Конвертація методу клас в атрибути тільки для читання;
- Як реалізувати сеттери і геттери в атрибут
Один з найпростіших способів використання property. це використовувати його в якості декоратора методу. Це дозволить вам перетворити метод класу в атрибут класу. Для мене це було дуже корисно, коли мені потрібно зробити якусь комбінацію значень. Для інших це було дуже до речі при написанні методів конверсії, які потрібно було прийняти в якості методів. Давайте поглянемо на простий приклад:
Якщо ви погляньте на підписи під властивістю, то це будуть fget. fset. fdel і doc в якості аргументів. Ви можете створити інший декорується метод, використовуючи ту ж назву зв'язку з функцією delet за допомогою <@fee.deleter*>*. якщо ви хочете зловити команду ** del для атрибута.
Підведемо підсумки
З цього моменту ви повинні розуміти, як створювати власні декоратори і як використовувати вбудовані декоратори Python. Ми розглянули classmethod. @property і @staticmethod. Сподіваюся, ви будете використовувати вбудовані декоратори, і створювати свої власні.
Списки, кортежі і словники в Python
Вивчаємо lambda-функції в Python