Что такое декоратор функции Python: основы и примеры использования
Что такое декоратор функции в Python?
Декоратор функции в Python - это особая конструкция, которая позволяет изменять поведение функции, не изменяя ее саму.
Декораторы написаны как обычные функции, которые принимают одну функцию в качестве аргумента и возвращают другую функцию. Они обычно используются для добавления нового функционала к существующим функциям без их изменения.
Вот пример, чтобы проиллюстрировать:
def decorator_function(original_function):
def wrapper_function(*args, **kwargs):
# Дополнительный код до выполнения функции
result = original_function(*args, **kwargs)
# Дополнительный код после выполнения функции
return result
return wrapper_function
@decorator_function
def my_function():
print("Привет, я функция!")
my_function()
В этом примере мы создаем декораторную функцию с именем decorator_function, которая принимает оригинальную функцию my_function в качестве аргумента. Внутри декоратора мы определяем новую функцию wrapper_function, которая оборачивает оригинальную функцию и добавляет дополнительный код до и после ее выполнения.
Затем мы используем символ @, чтобы применить декоратор к нашей функции. Теперь, когда мы вызываем my_function(), она будет выполняться с дополнительным кодом, добавленным благодаря декоратору.
Декораторы - мощный инструмент в Python, который позволяет создавать более гибкий и модульный код. Они широко используются во множестве сценариев, таких как логирование, кэширование и аутентификация.
Детальный ответ
Что такое декоратор функции в Python?
В Python декоратор функции является мощным инструментом, который позволяет изменять поведение функции без необходимости изменять ее исходный код. Декораторы позволяют вам добавлять дополнительную функциональность к существующим функциям, не изменяя их структуру. Они представляют собой обертки вокруг функций, которые позволяют выполнять код до и после вызова целевой функции и манипулировать ее аргументами и возвращаемыми значениями.
Основная идея декораторов заключается в том, чтобы обернуть функцию в другую функцию, называемую "декоратором", которая расширяет или изменяет поведение целевой функции. Для создания декораторов в Python используются функции высшего порядка. Функции высшего порядка - это функции, которые могут принимать другие функции в качестве аргументов или возвращать их в качестве результата.
Пример использования декораторов функции
def uppercase_decorator(func):
def wrapper():
result = func().upper()
return result
return wrapper
@uppercase_decorator
def greeting():
return "Привет, мир!"
print(greeting())
В этом примере у нас есть две функции: uppercase_decorator
и greeting
. Функция uppercase_decorator
является нашим декоратором. Она принимает функцию func
в качестве аргумента и возвращает обертку вокруг этой функции. Внутри декоратора мы можем выполнить любой код, который нам нравится, перед и после вызова целевой функции.
Аннотация @uppercase_decorator
перед функцией greeting
указывает, что мы хотим применить наш декоратор к этой функции. Когда мы вызываем greeting()
, декоратор uppercase_decorator
автоматически оборачивает вызов функции и преобразует результат в верхний регистр.
Параметризованный декоратор функции
Декораторы также могут принимать аргументы. Это полезно, когда вы хотите настроить поведение декоратора в зависимости от заданных параметров. Для создания параметризованного декоратора вам нужно создать функцию, которая принимает аргументы декоратора и возвращает декоратор.
def repeat(num_times):
def decorator_repeat(func):
def wrapper():
for _ in range(num_times):
func()
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet():
print("Привет!")
greet()
В этом примере у нас есть две функции: repeat
и greet
. Функция repeat
принимает параметр num_times
и возвращает декоратор decorator_repeat
. Декоратор decorator_repeat
берет функцию func
в качестве аргумента и оборачивает ее в цикл, повторяющийся num_times
раз.
Аннотация @repeat(num_times=3)
перед функцией greet
указывает, что мы хотим применить наш декоратор с параметром num_times=3
к этой функции. Когда мы вызываем greet()
, декоратор repeat
оборачивает вызов функции и повторяет его три раза.
Множественные декораторы
В Python можно применять несколько декораторов к одной функции. Это позволяет применять различные декораторы для разных аспектов поведения функции.
def bold_decorator(func):
def wrapper():
result = "<b>" + func() + "</b>"
return result
return wrapper
def uppercase_decorator(func):
def wrapper():
result = func().upper()
return result
return wrapper
@bold_decorator
@uppercase_decorator
def greeting():
return "Привет, мир!"
print(greeting())
В этом примере у нас есть две функции-декоратора: bold_decorator
и uppercase_decorator
. Аннотации @bold_decorator
и @uppercase_decorator
перед функцией greeting
указывают, что сначала нужно применить bold_decorator
, а затем uppercase_decorator
к этой функции. Результатом вызова greeting()
будет строка, заключенная в теги <b> и преобразованная в верхний регистр.
Заключение
Декораторы функции в Python позволяют изменять поведение функций, не изменяя их исходный код. Они являются мощным инструментом, который позволяет вам добавлять дополнительную функциональность к существующим функциям. Вы можете создавать простые или параметризованные декораторы и использовать их вместе для создания сложных композиций. Декораторы позволяют создавать более гибкие и модульные программы в Python.
Надеюсь, этот материал помог вам лучше понять, что такое декоратор функции в Python и как их использовать. Применение декораторов поможет вам улучшить структуру вашего кода и добавить новые возможности к вашим функциям.