https://www.youtube.com/watch?v=Ss1M32pp5Ew&ab_channel=OlegMolchanov

Функция, которая принимает другую функцию в качестве аргумента и добавляет к ней некоторую функциональность

Цель декоратора: Чтобы изменить поведение функции без изменения ее исходного кода

Применение декораторов

Декораторы удобно использовать тогда, когда есть дублирование кода в функциях и этот код не относится к целевому коду конкретной функции (тот код который можно вынести за скобки).

Дублирующий код противоречит принципу единой ответственности, а также принципу DRY. И для того чтобы не повторять, чтобы вынести эту функциональность отдельно имеет смысл делать декоратор. Применяется в:

Простой декоратор

def text_decor(func):
    def wrapper(*args,**kwargs):
        print('Hello')
        func(*args,**kwargs)
        print('Good buy')
    return wrapper