Марк Лутц «Изучаем Python», глава 39:
«Так определяется и применяется декоратор функции, который подсчитывает количество вызовов декорированной функции и для каждого вызова выводит трассировочное сообщение».
Ключевые моменты работы декоратора:
🔘 При декорировании (@𝚝𝚛𝚊𝚌𝚎𝚛) создается экземпляр класса 𝚝𝚛𝚊𝚌𝚎𝚛, который сохраняет исходную функцию 𝚜𝚙𝚊𝚖 в атрибуте 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌
🔘 Счетчик вызовов 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 инициализируется нулем
🔘 При каждом вызове декорированной функции 𝚜𝚙𝚊𝚖 срабатывает метод __𝚌𝚊𝚕𝚕__ класса 𝚝𝚛𝚊𝚌𝚎𝚛
Как отмечается в учебнике: «При последующих вызовах: запуск исходной функции»
Последовательность выполнения:
🔘 Вызов 𝚜𝚙𝚊𝚖(𝟷, 𝟸, 𝟹) перехватывается декоратором
🔘 Увеличивается счетчик 𝚜𝚎𝚕𝚏.𝚌𝚊𝚕𝚕𝚜 (становится 𝟷)
🔘 Выводится сообщение '𝚌𝚊𝚕𝚕 𝟷 𝚝𝚘 𝚜𝚙𝚊𝚖'
🔘 Вызывается исходная функция 𝚜𝚎𝚕𝚏.𝚏𝚞𝚗𝚌(∗𝚊𝚛𝚐𝚜), которая возвращает 𝟼 (𝟷+𝟸+𝟹)
🔘 Результат 𝟼 присваивается переменной 𝚛𝚎𝚜𝚞𝚕𝚝 и выводится
🔘 Выводится значение 𝚜𝚙𝚊𝚖.𝚌𝚊𝚕𝚕𝚜, которое равно 𝟷
«Обратите внимание, что общее количество вызовов отображается как атрибут декорированной функции».
Важно отметить, что в отличие от оригинального примера из учебника, в данной задаче функция 𝚜𝚙𝚊𝚖 возвращает результат (𝚛𝚎𝚝𝚞𝚛𝚗 𝚊 + 𝚋 + 𝚌), поэтому декоратор также должен возвращать результат вызова исходной функции.
Post #4273
742
- 👍 2
- 👎 1