======Декоратор======
Итак, что же это такое? Для того, чтобы понять, как работают декораторы, в первую очередь следует вспомнить, что функции в 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