Декоратори в Python - Astro blog
Жодної чарівно нової інформації тут не буде, скоріше це самому собі пояснення, що за звір такий декоратор в python.
Т.к. в pyhton ф-ії є об'єктами, то до них можна застосувати шаблон проектування декоратора. Сам шаблон я на момент написання цих рядків не розбирав, тому тут може бути не зовсім коректна інформація про те, наскільки правильно реалізується даний шаблон у випадку ф-ій мови python.
тепер обернемо just_func
Можна подібному виклику ф-ії додати ім'я:
І при викликі just_func_wrapped отримаємо те саме:
Ми майже дісталися до суті. Як це можна було записати за допомогою синтаксису декораторів:
І викликавши just_func отримаємо:
Тобто. синтаксис декоторів це синтаксичний цукор, що замінює таку конструкцію:
Передача аргументів усередину обгортки
Також можна, а точніше це і потрібно, передавати агрументи всередину ф-ії декоратора, ф-ії, що обертається.
Декор методів у класах
Передача *args та **kwargs декорованої ф-ії
Передача аргументів декоратору
Логічно виникає питання: "А як же передати аргументи в декоратор, якщо декоратор за визначенням повинен приймати на вхід тільки ім'я ф-ії, що декорується?".
Рішення є, але не легке. Декоратор декоратор (crazy).
Або можна записати так:
А тепер те ж саме, але тільки за допомогою @:
Т.к. декоратор тепер є виклик ф-ії, то можемо передати йому деякі аргументи:
Знаючи все, що тут написано, можна зробити декоратор для декораторів якому можна передавати будь-які аргументи:
Тепер подивимося як скористатися цією пеклою сумішшю:
Тепер декоруємо потрібні нам ф-ії передаючи будь-які аргументи декоратору:
Підбиваючи підсумки
Загалом цей довгопост перероблений зхабра, створювався коли я включався у підглянутий код у django, де у 4 рядках прихована ціла темрява сенсу та матеріалу для вивчення. Там створювався клас mixin у якому декорувався якийсь метод що знепасував доступ до сайту. Ацька суміш без розгорнутих пояснень на англ. мовою. Ну от що з декораторами начебто розібрався.
Де ще застосовується декорування?
Декоратори можуть бути використані для розширення можливостей функцій зі сторонніх бібліотек (код яких ми не можемо змінювати), або для спрощення налагодження (ми не хочемо змінювати код, який ще не витримався). Також корисно використовувати декоратори для розширення різних функцій одним і тим же кодом, без повторного його переписування щоразу, наприклад: