В нескольких следующих постах я хочу поговорить о декораторах. Будет базовое определение, мотивация их использовать, всякие хитрости, а еще куча примеров. Прежде, чем говорить о декораторах, нужно кое- что узнать о функциях в Python. Допустим, у нас есть функция, которая здоровается с Юпи: def hey_Jupi(): print("Привет, Юпи!") Функции в Python -- это объекты первого класса, ничем не хуже, чем int'ы или словари. Это значит, что: 🐙 Функцию можно присвоить переменной: say_hi = hey_Jupi say_hi() # Привет, Юпи! 🐙 Функцию можно вернуть из функции: def wrapper(func): print("Юпи пришла.") return func hello_Jupi = wrapper(hey_Jupi) # Юпи пришла. hello_Jupi() # Привет, Юпи! 🐙 Функцию можно определить внутри другой функции: def deco(func): def wrapper(): print("Юпи пришла.") func() return wrapper hey_Jupi = deco(hey_Jupi) hey_Jupi() # Юпи пришла. # Привет, Юпи! Смотрите, что получилось на последнем шаге. На этапе создания deco никакой код не выполняется -- мы заходим в deco, видим, что здесь