Декораторы в Python
Добавить в избранноеДекораторы - это одна из мощных возможностей Python, позволяющая изменять поведение функций или методов без изменения их исходного кода. По сути, декоратор - это функция, которая принимает другую функцию в качестве аргумента и возвращает модифицированную версию этой функции.
Основные принципы работы декораторов
Декоратор принимает функцию как параметр, изменяет или дополняет её поведение, а затем возвращает новую функцию, которая заменяет оригинальную.
Пример простого декоратора:
# Определение функции-декоратора def select(input_func): def output_func(): print("*****************") # Выводим символы перед вызовом функции input_func() # Вызов оригинальной функции print("*****************") # Выводим символы после вызова функции return output_func # Возвращаем новую функцию # Определение оригинальной функции @select # Применение декоратора def hello(): print("Привет bbcat.ru") # Вызов функции hello()
В результате выполнения программы вывод будет следующим:
*****************
Привет bbcat.ru
*****************
1. Декоратор select принимает функцию hello как параметр input_func.
2. Внутри декоратора создаётся новая функция output_func, которая добавляет дополнительное поведение (вывод звёздочек) до и после вызова оригинальной функции input_func.
3. Когда вызывается функция hello, на самом деле выполняется функция output_func, которая модифицирует её поведение.
Работа с аргументами
Декораторы могут не только изменять поведение функций, но и обрабатывать их параметры.
Пример декоратора с параметрами:
# Определение функции-декоратора def check(input_func): def output_func(*args): # Принимаем аргументы оригинальной функции input_func(*args) # Передаём их в оригинальную функцию return output_func @check def print_person(name, age): print(f"Имя: {name}, Лет: {age}") # Вызов функции с параметрами print_person("Кира", 19)
Вывод программы:
Имя: Кира, Лет: 19
Декоратор check принимает любую комбинацию аргументов с помощью *args и передаёт их в оригинальную функцию. Таким образом, можно модифицировать логику обработки параметров.
Обработка и модификация значений параметров
Декораторы позволяют проверять или изменять значения аргументов до того, как они будут переданы в функцию.
Пример с проверкой параметров:
def check(input_func): def output_func(*args): name = args[0] age = args[1] if age < 0: age = 1 # Изменяем возраст, если он отрицательный input_func(name, age) return output_func @check def print_person(name, age): print(f"Имя: {name}, Лет: {age}") print_person("Кира", 19) print_person("Вика", -5)
Вывод программы:
Имя: Кира, Лет: 19
Имя: Вика, Лет: 1
В данном случае декоратор проверяет параметр age, и если он меньше 0, изменяет его на 1.
Получение и изменение результата функции
Декоратор также может перехватывать результат выполнения функции и изменять его.
Пример декоратора, изменяющего результат функции:
def check(input_func): def output_func(*args): result = input_func(*args) if result < 0: result = 0 # Если результат меньше нуля, возвращаем 0 return result return output_func @check def sum(a, b): return a + b result1 = sum(10, 20) print(result1) # 30 result2 = sum(10, -20) print(result2) # 0
Вывод программы:
30
0
В данном примере функция sum возвращает сумму двух чисел, но декоратор check изменяет результат, если он отрицательный, и возвращает 0.
Заключение
Декораторы - это гибкий инструмент, который позволяет изменять и дополнять поведение функций без изменения их кода. Они особенно полезны при решении задач, связанных с логированием, обработкой ошибок, модификацией параметров или результатов функции.