Введение
Декораторы в Python позволяют изменять или улучшать поведение функции, класса или метода. Это способ динамически изменить функциональность вашего кода, не изменяя исходный код. В этом практическом занятии мы изучим основы декораторов и научимся использовать их для добавления функциональности в свой код.
Понимание декораторов
Начнем с простого примера. Откройте новую сессию интерпретатора Python:
python3
У нас есть функция, которая вычисляет квадрат числа:
def square(x):
return x**2
Теперь предположим, что мы хотим добавить функцию в square, которая логирует входные и выходные данные функции каждый раз, когда она вызывается. Мы можем сделать это с использованием декоратора.
Вот код для декоратора logger:
def logger(func):
def wrapper(x):
print("Calling function:", func.__name__)
print("Input:", x)
result = func(x)
print("Output:", result)
return result
return wrapper
Теперь мы можем использовать этот декоратор, чтобы улучшить функцию square:
@logger
def square(x):
return x**2
Когда мы вызываем square(5), вывод будет таким:
Calling function: square
Input: 5
Output: 25
Как вы можете видеть, декоратор добавил необходимую функциональность к функции square, не меняя ее исходный код.
Декораторы с параметрами
Декораторы также могут принимать параметры. Например, мы можем модифицировать декоратор logger, чтобы он принимал сообщение, которое будет выводиться перед записями о входных и выходных данных.
def logger(message):
def decorator(func):
def wrapper(x):
print(message)
print("Calling function:", func.__name__)
print("Input:", x)
result = func(x)
print("Output:", result)
return result
return wrapper
return decorator
Теперь мы можем использовать этот обновленный декоратор, чтобы улучшить функцию square:
@logger("This is a custom message")
def square(x):
return x**2
Когда мы вызываем square(5), вывод будет таким:
This is a custom message
Calling function: square
Input: 5
Output: 25
Использование нескольких декораторов
Вы также можете использовать несколько декораторов друг на друга, чтобы добавить несколько уровней функциональности. Например, давайте создадим новый декоратор под названием timer, который измеряет время выполнения функции:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print("Time elapsed:", end_time - start_time)
return result
return wrapper
Теперь давайте используем оба декоратора logger и timer для функции square:
@logger("This is a custom message")
@timer
def square(x):
return x**2
Когда мы вызываем square(5), вывод будет таким:
This is a custom message
Calling function: square
Input: 5
Output: 25
Time elapsed: 0.000001
Как вы можете видеть, декоратор timer добавил информацию о времени выполнения к функции square, в то время как декоратор logger добавил записи о входных и выходных данных и пользовательское сообщение.
Резюме
В этом практическом занятии мы изучили основы декораторов в Python. Мы увидели, как использовать декораторы для изменения поведения функции, класса или метода, и как использовать несколько декораторов для добавления нескольких уровней функциональности. Мы также увидели, как использовать декораторы с параметрами для добавления пользовательской функциональности.
С этими навыками вы теперь можете начать использовать декораторы в своем коде, чтобы облегчить себе жизнь разработчика!



