Что такое декораторы
Декоратором называется функция, которая принимает функцию с таким же именем, как у исходной, но с расширенной функциональностью. Декораторы часто используются во фреймворках, чтобы упростить интеграцию пользовательских функций с фреймворком.
Паттерн Декоратор настолько полезен, что в 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
Примеры ответов:
- Junior Python Developer: полный разб…
- Tech Interview Fest | Моковое собесе…
- Собеседование на позицию Backend Dev…
- Собеседование Junior Python Developer
- Собеседование Trainee Python Develop…
- Собеседование Python. Разбор вопросов
- Собеседование Python 2023. Разбор ба…
- Собеседование Python developer на 40…
- luchanos | Balabot IT LIVE | Собесед…
- Публичное собеседование: Junior Pyth…
- 15 теоретических вопросов для начина…