Как создать простой декоратор?

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

    
def my_decorator(func):
    def wrapper():
        print("Что-то делается до вызова функции.")
        func()
        print("Что-то делается после вызова функции.")
    return wrapper

@my_decorator
def say_hello():
    print("Привет!")

say_hello()
    
  

Описание: my_decorator - функция, принимающая другую функцию (func) и возвращающая новую функцию (wrapper). wrapper выполняет действия до и после вызова исходной функции. @my_decorator - синтаксический сахар для say_hello = my_decorator(say_hello).


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

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


<!-- Пример декоратора -->
def my_decorator(func):
    def wrapper():
        print("Что-то происходит перед вызовом функции.")
        func()
        print("Что-то происходит после вызова функции.")
    return wrapper

@my_decorator
def say_hello():
    print("Привет!")

say_hello()
<!-- Конец примера -->
  

Разберем пример:

  • my_decorator(func): Это и есть наш декоратор. Он принимает функцию func в качестве аргумента.
  • wrapper(): Это внутренняя функция, которую возвращает декоратор. Именно она добавляет новую функциональность.
  • func(): Внутри wrapper() мы вызываем исходную функцию func(). Это позволяет нам выполнить исходную функцию с добавленной логикой.
  • return wrapper: Декоратор возвращает функцию wrapper.
  • @my_decorator: Синтаксис @my_decorator над функцией say_hello - это синтаксический сахар. Он эквивалентен say_hello = my_decorator(say_hello). То есть, мы передаем say_hello в my_decorator и результат (функцию wrapper) присваиваем обратно say_hello.

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


Что-то происходит перед вызовом функции.
Привет!
Что-то происходит после вызова функции.
  

Другой пример, декоратор с аргументами:


<!-- Пример декоратора с аргументами -->
def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                value = func(*args, **kwargs)
            return value
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Привет, {name}!")

greet("Иван")
<!-- Конец примера -->
    

Разберем пример:

  • repeat(num_times): Это фабрика декораторов. Она принимает аргументы для настройки поведения декоратора.
  • decorator_repeat(func): Это сам декоратор, он принимает функцию.
  • wrapper(*args, **kwargs): Внутренняя функция, принимающая произвольное количество позиционных и именованных аргументов, необходимых для декорируемой функции.
  • В цикле for функция func вызывается num_times раз.
  • @repeat(num_times=3): Декорируем функцию greet, указав, что нужно повторить ее выполнение 3 раза.

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


Привет, Иван!
Привет, Иван!
Привет, Иван!
    

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

0