Использование декораторов в Python

Рассмотрим в статье теоретическое и практическое применение декораторов в Python.

Введение

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

Прежде чем перейти дальше к основной теме, давайте рассмотрим основные моменты.

Объекты первого класса 

В Python функции являются объектами первого класса:

  • Они могут храниться как переменные
  • Они могут быть переданы в качестве аргумента внутри функции
  • Они могут быть возвращены из функций в виде значений
  • Они действуют точно так же, как переменные

Функции высшего порядка

Функции высшего порядка — это функции, которые:

  • Принимают другую функцию в качестве аргумента.
  • Возвращают другую функцию.

Как раз декораторы используют эти функции.

Что такое декораторы?

Простыми словами, декораторы — это то, что украшает нашу функцию.

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

Алгоритм действий в программировании

Теперь пришло время создать своего собственного декоратора:

def new_decorator(func):
    def wrapper(*args, **kwargs):
        print("-")
        func(*args, **kwargs)
        print("*")

    return wrapper


@new_decorator
def hello(greeting, msg):
    print(greeting, msg)


hello(
    "Привет ребята",
    "Добро пожаловать",
)

Вывод программы:

-
Привет ребята Добро пожаловать
*

Пошаговое объяснение:

  1. new_decorator — это функция, содержащая функцию-оболочку.
  2. wrapper — это функция, которая обертывает в оболочку функцию. Она также добавляет некоторые характеристики к этой функции.
  3. new_decorator — это фактическая функция, которую мы хотим улучшить.
  4. Добавляя @ перед функцией, прикрепляем фактическую функцию к декоратору. Здесь @new_decorator — это имя функции декоратора.

Пример использования декоратора

После изучения приведенного выше примера вы можете задаться вопросом, в чем на самом деле заключается потребность этого декоратора или где мы можем его использовать.

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

Так же у меня есть группа ВКонтакте @yegorovegor. Обязательно подпишись!

Давайте посмотрим пример, где я хочу вычислить время, затраченное функцией:

from time import time


def perf(func):
    def wrapper(*args, **kwargs):
        t1 = time()
        result = func(*args, **kwargs)
        t2 = time()
        print(f"Затраченное время {t2-t1} сек")
        return result

    return wrapper


@perf
def run():
    for i in range(100000000):
        i * 6


run()

Вывод программы:

Затраченное время 9.065523862838745 сек

Здесь декоратор вычисляет время до и после выполнения функции. Затем он вычисляет разницу этого времени. Отсюда и отдача затраченного времени.

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

Вывод

Сегодня мы рассмотрели, как использовать декораторы, как их создавать и для чего они используются. Надеюсь статья была легкой в усвоении, а если нет — пишите ваши вопросы в комментариях 🙂

close

Изучаешь Python?

Оформи подписку и получи моментальный доступ к новым публикациям

Обязательно прочитайте другие статьи посвященные языку программирования Python

Добавить комментарий

Ваш адрес email не будет опубликован