======Декоратор====== Итак, что же это такое? Для того, чтобы понять, как работают декораторы, в первую очередь следует вспомнить, что функции в python являются объектами, соответственно, их можно возвращать из другой функции или передавать в качестве аргумента. Также следует помнить, что функция в python может быть определена и внутри другой функции. Вспомнив это, можно смело переходить к декораторам. Декораторы — это, по сути, "обёртки", которые дают нам возможность изменить поведение функции, не изменяя её код. ==Пример обертки== def hello(): return 'Hello, i am '+'hello' def superFunc(func): print('Hello, i am '+'superFunc') print(func()) superFunc(hello) Результат выполнения: Hello, i am superFunc Hello, i am hello ==В следующем примере возвращаем указатель на функцию в переменную:== def hello(): return 'Hello, i am '+'hello' test = hello print(test()) Результат выполнения: Hello, i am hello ==Декоратор функции по сути обертка, ниже показан более наглядный пример:== def myDecorator(func): ''' Декоратор :param func: декорируемая функция ''' def wrapper(): print('code before') func() print('code after') return wrapper def hello(): print('Hello, i am '+'hello') f = myDecorator(hello) f() Результат выполнения: code before Hello, i am hello code after ==Вот так можно было записать предыдущий пример, используя синтаксис декораторов:== def myDecorator(func): ''' Декоратор :param func: декорируемая функция ''' def wrapper(): print('code before') func() print('code after') return wrapper @myDecorator def hello(): print('Hello, i am '+'hello') hello() Результат выполнения: code before Hello, i am hello code after То есть, декораторы в python — это просто синтаксический сахар. При этом, естественно, можно использовать несколько декораторов для одной функции. Также нужно помнить о том, что важен порядок декорирования. def myDecorator(func): ''' Декоратор :param func: декорируемая функция ''' def wrapper(): title = func() title ='wrap(' + title + ')wrap' return title return wrapper def makeTile(func): def wrapper(): title = func() title = title.capitalize() title = title.replace(',','') return title return wrapper @myDecorator @makeTile def hello(): return 'hello, i am function' print(hello()) Результат выполнения: wrap(Hello i am function)wrap