Декоратор подменяет вызов функции. Если у нас: @decor
def func(p, q): ... , то при вызове: res = func(a, b) в реальности будет выполнено: temp = decor(func)
res = temp(a, b) Т.е. сначала вызывается функция-декоратор, которая в качестве параметра получает декорируемую функцию. Функция-декоратор возвращает функцию и уже эта возвращённая декоратором функция вызывается с параметрами вызова декорируемой функции.
1) декоратор одинаково декарирует разные функции
2) применение, навешивать цепь из разых декораторов чтобы писать динамический код которы меняет свое поведение на ходу
выучи паттенры проектирвоания на нормальном язаке и все поймешь