Что такое декоратор в Python? Узнай всю суть!
Декоратор в Python - это специальный вид синтаксического сахара, который позволяет изменять поведение функции или класса без изменения их исходного кода. Декораторы позволяют добавлять функциональность, оборачивая исходный код вокруг другого кода.
Пример:
@decorator
def my_function():
# код функции
pass
В приведенном примере @decorator
- это декоратор, который применяется к функции my_function
. Декоратор может выполнять различные действия, такие как логирование, кэширование, аутентификацию и т. д.
Декораторы могут принимать аргументы:
@decorator(arg1, arg2)
def my_function():
# код функции
pass
Как и в первом примере, декоратор @decorator
применяется к функции my_function
, но с аргументами arg1
и arg2
.
Детальный ответ
Декоратор - это что в Python?
В Python декоратор - это особый вид функции, которая изменяет поведение другой функции без изменения ее собственного кода. Он позволяет добавлять новую функциональность к существующим функциям, используя модульность и гибкость языка. Декораторы в Python - это мощный инструмент, который помогает сделать код более читабельным, модульным и удобным для использования.
Рассмотрим пример, чтобы лучше понять, что такое декоратор в Python. Предположим, у нас есть функция say_hello()
, которая просто выводит приветствие на экран:
def say_hello():
print("Привет, мир!")
Теперь допустим, нам нужно добавить дополнительную функциональность к этой функции, например, логирование каждого вызова функции. Вместо того, чтобы изменять код самой функции say_hello()
, мы можем использовать декоратор, чтобы добавить логирование:
def logger_decorator(func):
def wrapped():
print("Вызвана функция:", func.__name__)
func()
return wrapped
@logger_decorator
def say_hello():
print("Привет, мир!")
В приведенном выше примере мы определяем функцию-декоратор logger_decorator()
с аргументом func
. Внутри нее мы определяем новую функцию wrapped()
, которая выводит сообщение о вызове функции и затем вызывает исходную функцию func()
. Затем мы используем декоратор @logger_decorator
перед функцией say_hello()
, чтобы применить декоратор к этой функции.
Теперь, когда мы вызываем функцию say_hello()
, будет выводиться сообщение о вызове функции:
say_hello()
# Output:
# Вызвана функция: say_hello
# Привет, мир!
Как видите, декоратор logger_decorator()
добавил логирование к функции say_hello()
без изменения кода самой функции. Это дает нам гибкость изменять поведение функций, не затрагивая их исходный код.
Декораторы в Python также могут принимать аргументы и даже быть стеком из нескольких декораторов. Например, мы можем создать новый декоратор uppercase_decorator()
, который будет преобразовывать вывод в верхний регистр:
def uppercase_decorator(func):
def wrapped():
result = func()
return result.upper()
return wrapped
@logger_decorator
@uppercase_decorator
def say_hello():
return "Привет, мир!"
say_hello()
# Output:
# Вызвана функция: wrapped
# ПРИВЕТ, МИР!
В приведенном выше примере мы определяем новый декоратор uppercase_decorator()
, который преобразует результат функции в верхний регистр. Затем мы применяем оба декоратора, logger_decorator
и uppercase_decorator
, к функции say_hello()
. При вызове say_hello()
сначала выполняется декоратор uppercase_decorator
, а затем декоратор logger_decorator
.
Это только примеры использования декораторов в Python. Декораторы позволяют легко добавлять различные функциональные возможности к нашим функциям и классам, делая наш код более гибким и модульным.