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

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

Паттерн Декоратор настолько полезен, что в Python встроена специальная поддержка для него. В Python декорировать можно как функции, так и методы. Кроме того, Python поддерживает декораторы классов: функции, которые принимают класс в качестве аргумента и возвращают новый класс с таким же именем, как у исходного, но с дополненной функциональностью.

Иногда декораторы классов удобно использовать как альтернативу производным классам.


class TextTag:
    """Represents a base text tag"""

    def __init__(self, text):
        self._text = text

    def render(self):
        return self._text


class BoldWrapper(TextTag):
    """Wraps a tag in <b>"""

    def __init__(self, wrapped):
        self._wrapped = wrapped

    def render(self):
        return "<b>{}</b>".format(self._wrapped.render())


class ItalicWrapper(TextTag):
    """Wraps a tag in <i>"""

    def __init__(self, wrapped):
        self._wrapped = wrapped

    def render(self):
        return "<i>{}</i>".format(self._wrapped.render())


if __name__ == '__main__':
    simple_hello = TextTag("hello, world!")
    special_hello = ItalicWrapper(BoldWrapper(simple_hello))
    print("before:", simple_hello.render())
    print("after:", special_hello.render())

# OUTPUT #
# before: hello, world!
# after: <i><b>hello, world!</b></i>

 

Oct. 10, 2023, Источник

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

Цель декоратора: изменить поведение функции без изменения ее исходного кода

  • Технически декораторы реализуются через механизм замыкания
  • Это некий синтаксический сахар

Применение декораторов

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

Дублирующий код противоречит принципу единой ответственности, а также принципу DRY. И для того чтобы не повторять, чтобы вынести эту функциональность отдельно имеет смысл делать декоратор. Применяется в:

  • rout (flask)
  • loginrequaet (django, flask)
  • логировании
  • подсчете времени

Простой декоратор

def text_decor(func):
    def wrapper(*args,**kwargs):
        print('Hello')
        func(*args,**kwargs)
        print('Good buy')
    return wrapper

Oct. 10, 2023, Источник

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

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

Давайте рассмотрим простой пример. Предположим, у нас есть функция, которая просто печатает "Привет!":

def say_hello(): print("Привет!")

Теперь мы хотим добавить функционал для логирования (регистрации) времени выполнения этой функции. Мы можем написать декоратор для этого:

import time

def time_decorator(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print("Время выполнения функции: ", end_time - start_time)
    return wrapper

@time_decorator
def say_hello():
    print("Привет!")

В этом примере time_decorator - это декоратор. Он принимает функцию func и возвращает новую функцию wrapper. wrapper запускает исходную функцию func, измеряет время ее выполнения и печатает это время. Мы применяем этот декоратор к функции say_hello, используя синтаксис @time_decorator, и теперь каждый раз, когда вызывается say_hello, автоматически измеряется и выводится время ее выполнения.

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

Коротко: Декораторы в Python - это функции, которые изменяют поведение других функций, делая код более модульным и поддерживаемым.

Jan. 14, 2024, ChatGPT-4