Декораторы в Python

FavoriteLoadingДобавить в избранное

Декораторы - это одна из мощных возможностей 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.

Заключение

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

Написать Администратору

Вы можете написать Администратору сайта.

отправить