Основы декораторов в Python

PythonPythonBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/scope("Scope") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/function_definition -.-> lab-76{{"Основы декораторов в Python"}} python/scope -.-> lab-76{{"Основы декораторов в Python"}} python/decorators -.-> lab-76{{"Основы декораторов в Python"}} end

Введение в декораторы

Начнем с простого примера. Откройте новую сессию интерпретатора 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. Мы увидели, как использовать декораторы для изменения поведения функции, класса или метода, и как использовать несколько декораторов для добавления нескольких уровней функциональности. Мы также увидели, как использовать декораторы с параметрами для добавления пользовательской функциональности.

С этими навыками вы теперь можете начать использовать декораторы в своем коде, чтобы облегчить себе жизнь разработчика!