Декораторы

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

Декоратор — это функция, которая принимает другую функцию в качестве аргумента, добавляет к ней некоторую функциональность и возвращает новую функцию.
Синтаксис декоратора: Декоратор применяется с помощью символа @ перед определением функции.

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

Как это работает:

  1. Функция say_hello передается в декоратор my_decorator.
  2. Декоратор возвращает новую функцию wrapper, которая заменяет оригинальную say_hello.
  3. При вызове say_hello() выполняется код из wrapper, который вызывает оригинальную функцию func() (в данном случае say_hello).

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

Если декорируемая функция принимает аргументы, нужно использовать *args и **kwargs в wrapper, чтобы передать их в оригинальную функцию.

def my_decorator(func): def wrapper(*args, **kwargs): print("Что-то происходит перед вызовом функции.") result = func(*args, **kwargs) print("Что-то происходит после вызова функции.") return result return wrapper @my_decorator def greet(name): print(f"Привет, {name}!") greet("Алиса") # Вывод # Что-то происходит перед вызовом функции. # Привет, Алиса! # Что-то происходит после вызова функции.

Декораторы с параметрами

Иногда нужно передавать параметры самому декоратору. Для этого создается дополнительный уровень вложенности.

def repeat(num_times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(num_times): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def say_hello(): print("Привет!") say_hello() # Вывод # Привет! # Привет! # Привет!

Несколько декораторов

Функцию можно декорировать несколькими декораторами. Они применяются снизу вверх (то есть ближайший к функции декоратор выполняется последним).

def decorator1(func): def wrapper(): print("Декоратор 1") func() return wrapper def decorator2(func): def wrapper(): print("Декоратор 2") func() return wrapper @decorator1 @decorator2 def say_hello(): print("Привет!") say_hello() # Вывод # Декоратор 1 # Декоратор 2 # Привет!

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

Логирование
def log(func): def wrapper(*args, **kwargs): print(f"Вызов функции {func.__name__} с аргументами {args}, {kwargs}") result = func(*args, **kwargs) print(f"Функция {func.__name__} завершилась с результатом {result}") return result return wrapper @log def add(a, b): return a + b add(3, 5) add(6, 2)

Запустите код у себя и посмотрите как на практице работает декоратор для логгирования.

Проверка прав доступа

def check_admin(func): def wrapper(user, *args, **kwargs): if user != "admin": raise PermissionError("Только администратор может выполнять эту операцию") return func(user, *args, **kwargs) return wrapper @check_admin def delete_database(user): print("База данных удалена") delete_database("admin") # Работает delete_database("user") # Ошибка

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


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться