Декораторы Python — это мощная функция, которая позволяет программистам изменять поведение функций или классов, не меняя их исходный код. Они предоставляют простой и элегантный способ добавить функциональность к существующему коду, делая его более модульным, многоразовым и эффективным. В этой статье мы углубимся в различные методы использования декораторов с примерами кода, продемонстрировав их универсальность и полезность.
- Декораторы функций.
Декораторы функций — наиболее распространенный тип декораторов в Python. Они оборачивают функцию, изменяют ее поведение и возвращают новую функцию или вызываемый объект. Вот пример:
def uppercase_decorator(func):
def wrapper(*args, kwargs):
result = func(*args, kwargs)
return result.upper()
return wrapper
@uppercase_decorator
def greet(name):
return f"Hello, {name}!"
print(greet("John")) # Output: HELLO, JOHN!
- Декораторы классов.
Подобно декораторам функций, декораторы классов изменяют поведение классов. Они могут добавлять или переопределять методы, свойства или атрибуты класса. Вот пример:
def add_method_decorator(cls):
def new_method(self, x, y):
return x + y
cls.new_method = new_method
return cls
@add_method_decorator
class Calculator:
def multiply(self, x, y):
return x * y
calc = Calculator()
print(calc.multiply(3, 4)) # Output: 12
print(calc.new_method(3, 4)) # Output: 7
- Декораторы с аргументами.
Декораторы также могут принимать аргументы, что обеспечивает большую гибкость. Вот пример:
def repeat_decorator(times):
def decorator(func):
def wrapper(*args, kwargs):
for _ in range(times):
result = func(*args, kwargs)
return result
return wrapper
return decorator
@repeat_decorator(times=3)
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # Output: Hello, Alice! (printed 3 times)
- Объединение декораторов.
Декораторы можно объединять вместе, чтобы применять несколько модификаций к функции или классу. Вот пример:
def bold_decorator(func):
def wrapper(*args, kwargs):
result = func(*args, kwargs)
return f"<b>{result}</b>"
return wrapper
def italic_decorator(func):
def wrapper(*args, kwargs):
result = func(*args, kwargs)
return f"<i>{result}</i>"
return wrapper
@bold_decorator
@italic_decorator
def say_hello(name):
return f"Hello, {name}!"
print(say_hello("Mark")) # Output: <b><i>Hello, Mark!</i></b>
Декораторы Python предоставляют мощный механизм улучшения функциональности вашего кода. Используя декораторы, вы можете разделить задачи, способствовать повторному использованию кода и сделать его более читабельным. Изменяете ли вы поведение функций или классов, принимаете аргументы или связываете декораторы, декораторы — это универсальный инструмент в вашем наборе инструментов Python.