Инструменты пользователя

Инструменты сайта


python:sintaksicheskij_saxar:dekorator

Декоратор

Итак, что же это такое? Для того, чтобы понять, как работают декораторы, в первую очередь следует вспомнить, что функции в 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
python/sintaksicheskij_saxar/dekorator.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)