🎨 Что делает декоратор в Python? Подробная информация и примеры
Декоратор в Python - это функция, которая принимает другую функцию в качестве аргумента, расширяет ее функциональность и возвращает новую функцию. Он позволяет модифицировать поведение функции, не изменяя ее исходный код.
Вот пример:
def decorator_function(original_function):
def wrapper_function(*args, **kwargs):
# Дополнительный код, который расширяет функциональность оригинальной функции
return original_function(*args, **kwargs)
return wrapper_function
@decorator_function
def greeting():
print("Привет, мир!")
greeting()
Здесь мы создаем декораторную функцию decorator_function
, которая принимает оригинальную функцию greeting
в качестве аргумента. Внутри декоратора мы можем добавить дополнительный функционал, например, проверку аргументов или выполнение определенных действий перед вызовом оригинальной функции. Затем оригинальная функция обертывается внутри декоратора с помощью декораторного синтаксиса @decorator_function
.
Когда мы вызываем функцию greeting
, она на самом деле вызывает обернутую функцию внутри декоратора. Таким образом, мы можем добавить новую функциональность к оригинальной функции без изменения ее самого кода.
Детальный ответ
Декораторы в Python - это мощный инструмент, который позволяет изменять поведение функций или классов без их явного изменения. Они представляют собой особый вид оберток, которые позволяют добавить или изменить функциональность уже существующего кода.
Теперь давайте рассмотрим пример декоратора, чтобы лучше понять как они работают:
# Определяем простую функцию
def say_hello():
print("Привет, мир!")
# Определяем декоратор
def uppercase_decorator(func):
def wrapper():
# Выполняем функцию и получаем результат
result = func()
# Модифицируем результат
modified_result = result.upper()
# Возвращаем модифицированный результат
return modified_result
return wrapper
# Применяем декоратор к функции
say_hello = uppercase_decorator(say_hello)
# Вызываем функцию
say_hello()
В этом примере мы определили функцию say_hello, а затем создали декоратор uppercase_decorator. Декоратор возвращает внутреннюю функцию wrapper, которая содержит код для обертки функции say_hello. Когда мы вызываем функцию say_hello, она фактически вызывает обернутую функцию wrapper и возвращает результат.
Эта конкретная обертка переводит результат в верхний регистр. Теперь, когда мы вызываем функцию say_hello, она выводит "ПРИВЕТ, МИР!". Таким образом, мы успешно изменили поведение функции с помощью декоратора.
Декораторы также могут принимать аргументы. Рассмотрим пример:
# Определяем декоратор, который принимает аргументы
def repeat_decorator(num_repeats):
def decorator_func(func):
def wrapper():
for _ in range(num_repeats):
func()
return wrapper
return decorator_func
# Применяем декоратор с аргументами к функции
@repeat_decorator(3)
def say_hello():
print("Привет, мир!")
# Вызываем функцию
say_hello()
В этом примере мы определили декоратор repeat_decorator, который принимает аргумент num_repeats. Он возвращает функцию-декоратор decorator_func, которая в свою очередь возвращает обернутую функцию wrapper. При вызове функции say_hello, она будет повторяться указанное количество раз (3 раза в данном случае).
Декораторы также могут использоваться для классов. Рассмотрим пример:
# Определяем декоратор класса
def add_methods_decorator(cls):
class NewClass(cls):
def new_method(self):
print("Это новый метод!")
return NewClass
# Применяем декоратор к классу
@add_methods_decorator
class MyClass:
def existing_method(self):
print("Это существующий метод!")
# Создаем экземпляр класса
obj = MyClass()
# Вызываем существующий и новый методы
obj.existing_method()
obj.new_method()
В этом примере мы определили декоратор класса add_methods_decorator, который возвращает новый класс NewClass, основанный на исходном классе cls. В NewClass мы добавляем новый метод new_method. При создании экземпляра класса MyClass и вызове методов, исходный и новый методы будут доступны.
Таким образом, декораторы в Python предоставляют мощный и гибкий способ изменять поведение функций и классов без необходимости внесения изменений в изначальный код. Они позволяют добавлять, изменять или удалять функциональность, что делает декораторы важным инструментом для разработчиков.