Изучение возможностей декораторов Python: расширение функциональности вашего кода

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

  1. Декораторы функций.
    Декораторы функций — наиболее распространенный тип декораторов в 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!
  1. Декораторы классов.
    Подобно декораторам функций, декораторы классов изменяют поведение классов. Они могут добавлять или переопределять методы, свойства или атрибуты класса. Вот пример:
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
  1. Декораторы с аргументами.
    Декораторы также могут принимать аргументы, что обеспечивает большую гибкость. Вот пример:
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)
  1. Объединение декораторов.
    Декораторы можно объединять вместе, чтобы применять несколько модификаций к функции или классу. Вот пример:
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.