Что делает декоратор python? 🐍 Узнайте все о роли декораторов в Python
Декоратор в Python добавляет функциональность к существующей функции или классу без изменения их исходного кода. Он позволяет обернуть функцию или класс другой функцией, которая может выполнять определенные задачи до или после вызова обернутой функции.
Вот пример декоратора, который замеряет время выполнения функции:
def measure_time(func):
def wrapper(*args, **kwargs):
import time
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("Время выполнения:", end_time - start_time)
return result
return wrapper
@measure_time
def some_function():
# Код функции
pass
some_function()
Детальный ответ
Декоратор Python: что делает
Декораторы - это чрезвычайно мощный инструмент в языке программирования Python. Они позволяют модифицировать поведение функций или классов без непосредственного изменения их кода. Декораторы представляют собой функции высшего порядка, то есть функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию.
Теперь мы рассмотрим пример декоратора, который дополняет функцию приветствия:
def decorator(func):
def wrapper():
print("До вызова функции")
func()
print("После вызова функции")
return wrapper
@decorator
def say_hello():
print("Привет!")
say_hello()
Когда мы вызываем функцию say_hello(), происходит следующее:
- Декоратор decorator получает функцию say_hello в качестве аргумента.
- Декоратор создает новую функцию wrapper, которая содержит дополнительный код.
- Декоратор возвращает функцию wrapper.
- Затем вызывается функция wrapper, которая выводит сообщение "До вызова функции", затем вызывает исходную функцию say_hello, а затем выводит сообщение "После вызова функции".
Таким образом, декоратор позволяет нам добавить дополнительное поведение в функцию без ее изменения напрямую. Это может быть полезно для выполнения предварительных или последующих действий, записи логов, авторизации и других случаев использования.
Декораторы также могут принимать аргументы. Предположим, что у нас есть декоратор, который принимает целочисленный аргумент n, и выполняет функцию n раз:
def repeat(n):
def decorator(func):
def wrapper():
for _ in range(n):
func()
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Привет!")
say_hello()
В этом примере декоратор repeat принимает аргумент 3. Затем вы получаете декоратор decorator, который возвращает функцию wrapper, которая выполняет функцию n раз. Затем мы применяем декоратор repeat к функции say_hello, чтобы она вызывалась трижды.
Наконец, применение декораторов может быть стековым, то есть мы можем применить несколько декораторов к одной функции. Рассмотрим следующий пример:
def uppercase(func):
def wrapper():
original_result = func()
modified_result = original_result.upper()
return modified_result
return wrapper
def bold(func):
def wrapper():
original_result = func()
modified_result = f"{original_result}"
return modified_result
return wrapper
@bold
@uppercase
def say_hello():
return "Привет!"
print(say_hello())
В этом примере мы применяем декораторы uppercase и bold к функции say_hello. Декоратор uppercase приводит результат функции к верхнему регистру, а декоратор bold окружает результат жирным тегом. Результатом будет строка "Привет!", обернутая в жирный тег и в верхнем регистре.
Таким образом, декораторы позволяют легко и элегантно изменять поведение функций или классов. Они представляют собой мощный инструмент, который может улучшить модульность и переиспользование кода.