Декораторы - это инструмент Python, который позволяет изменять поведение функций, методов классов и других объектов без изменения исходного кода. Они используются для добавления дополнительного функционала к существующим объектам, обертывая их в другие функции. Давайте подробно рассмотрим, что такое декораторы и как их использовать, с примерами:
Определение декоратора
Декоратор в Python - это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию. Эта новая функция обычно расширяет или изменяет поведение исходной функции, добавляя к ней дополнительный функционал. Пример определения декоратора:
def my_decorator(func):
def wrapper():
print("Дополнительный код перед вызовом функции")
func()
print("Дополнительный код после вызова функции")
return wrapper
Использование декоратора
Чтобы использовать декоратор, вы просто помещаете символ `@` перед определением функции, к которой хотите применить декоратор, и указываете имя декоратора.
@my_decorator
def say_hello():
print("Привет, мир!")
say_hello()
При вызове функции `say_hello()` вывод будет выглядеть следующим образом:
Дополнительный код перед вызовом функции Привет, мир! Дополнительный код после вызова функции
Передача аргументов в декорируемую функцию
Если ваша функция принимает аргументы, вы можете передать их через декоратор, используя `*args` и `**kwargs`.
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Дополнительный код перед вызовом функции")
func(*args, **kwargs)
print("Дополнительный код после вызова функции")
return wrapper
@my_decorator
def greet(name):
print("Привет, {}!".format(name))
greet("Мир")
Декорирование методов класса
Декораторы также могут использоваться для декорирования методов класса.
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Дополнительный код перед вызовом метода")
func(*args, **kwargs)
print("Дополнительный код после вызова метода")
return wrapper
class MyClass:
@my_decorator
def greet(self, name):
print("Привет, {}!".format(name))
obj = MyClass()
obj.greet("Мир")
Многоуровневые декораторы
Вы можете применять несколько декораторов к одной функции или методу.
def uppercase(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
def bold(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return "<b>{}</b>".format(result)
return wrapper
@bold
@uppercase
def greet(name):
return "Привет, {}!".format(name)
print(greet("Мир"))
В этом примере сначала применяется декоратор `uppercase`, который преобразует результат в верхний регистр, а затем `bold`, который обрамляет результат в тег `<b>`.