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

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

 

Что такое декоратор

Декоратор — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию с расширенной или изменённой функциональностью. По сути, это способ «обернуть» одну функцию другой.

Простейший пример декоратора:

def my_decorator(func):

    def wrapper():

        print("Before function execution")

        func()

        print("After function execution")

    return wrapper

 

@my_decorator

def say_hello():

    print("Hello!")

say_hello()

 

Результат выполнения:

Before function execution

Hello!

After function execution

Здесь @my_decorator — это синтаксический сахар, который заменяет вызов say_hello = my_decorator(say_hello).

 

Применение декораторов

  1. Логирование
    Декораторы часто используют для автоматического логирования вызовов функций:

def log_decorator(func):

    def wrapper(*args, **kwargs):

        print(f"Calling function: {func.__name__}")

        return func(*args, **kwargs)

    return wrapper

 

@log_decorator

def add(a, b):

    return a + b

print(add(5, 3))

 

Результат:

Calling function: add

8

 

2. Измерение времени выполнения функции

import time

def timer(func):

    def wrapper(*args, **kwargs):

        start = time.time()

        result = func(*args, **kwargs)

        end = time.time()

        print(f"Execution time: {end - start:.5f} seconds")

        return result

    return wrapper

 

@timer

def long_task():

    time.sleep(2)

    print("Task finished")

long_task()

 

Вывод:

Task finished

Execution time: 2.00012 seconds

 

3. Проверка прав доступа
Декораторы удобно использовать для проверки прав пользователя перед выполнением функции.

def check_permission(func):

    def wrapper(user):

        if user == "admin":

            return func(user)

        else:

            print("Access denied")

    return wrapper

 

@check_permission

def admin_panel(user):

    print(f"Welcome, {user}!")

 

admin_panel("admin")   # Welcome, admin!

admin_panel("guest")   # Access denied

 

Декораторы с аргументами

Декораторы могут принимать собственные параметры. Для этого используется вложенная функция:

def repeat(times):

    def decorator(func):

        def wrapper(*args, **kwargs):

            for _ in range(times):

                func(*args, **kwargs)

        return wrapper

    return decorator

 

@repeat(3)

def greet(name):

    print(f"Hello, {name}!")

greet("Alice")

 

Вывод:

Hello, Alice!

Hello, Alice!

Hello, Alice!

 

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

Лого

Spartacus_85 [Admin]

Администратор сайта — это специалист, который отвечает за техническую поддержку и бесперебойную работу веб-ресурса.



0 Комментарий(я)

Зарегистрируйтесь чтобы оставить комментарий