Прежде, чем говорить о декораторах, нужно кое-что узнать о функциях в 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, видим, что здесь определена функция wrapper и возвращаем ее. Таким образом мы подменяем исходную hey_Jupi на wrapper и получаем новое поведение hey_Jupi, не изменяя ее код! Это и называ