Функции

Для чего нужны декораторы и как их использовать?

Функции и классы в Python – объекты удобные. Они сами могут быть входящими и исходящими аргументами функций. Это свойство можно использовать, чтобы сделать жизнь разработчика немного приятнее.

Смысл паттерна Декоратор заключается в том, что некоторая функция заворачивается в другую функцию, приобретая от нее новые возможности. Например, так можно вести логи, вводить пред- и постусловия, добавлять методы для классов.

Декораторы в Python – это, по сути, синтаксический сахар. Для их обозначения используется символ @.

Код ниже описывает обычный вариант приготовления сэндвича. Нужно взять что-нибудь мясное, обложить с двух сторон овощами и положить в булку.

def bread(func):
    def wrapper():
        print "</''''''\>"
        func()
        print "<\______/>"
    return wrapper

def vegetables(func):
    def wrapper():
        print "#помидорка#"
        func()
        print "~лист салата~"
    return wrapper

def sandwich(food="--ветчина--"):
    print food

sandwich = bread(vegetables(sandwich))
sandwich()

#</''''''\>
# #помидорка#
# --ветчина--
# ~лист салата~
#<\______/>

Изначально функция sandwich только печатает начинку, а затем она становится полноценным бутербродом. То же самое можно сделать чуть проще:

@bread
@vegetables
def sandwich(food="--ветчина--"):
    print food

sandwich()

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

В Python есть несколько встроенных декораторов, например, @classmethod, @staticmethod, @property.

Марина

Recent Posts

10 удалённых Python-вакансий

Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…

6 месяцев ago

Где искать Python-вакансии в 2026 году: зачем на Talanto.work появился отдельный сценарий поиска

Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…

6 месяцев ago

Срезы в Python со всеми подробностями

Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…

8 месяцев ago

Возведение в степень в Python: полное руководство

В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…

9 месяцев ago

Как удалить дубликаты из списка Python?

Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…

9 месяцев ago

Виртуальный (shared) хостинг от SpaceWeb: технический обзор

Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…

11 месяцев ago