Приступая к декораторам, мы все знаем, что он используется для украшения функции. Это означает, что мы можем добавить что-то дополнительное к существующей функции, но это можно сделать с помощью другой простой функции, также мы можем вызвать одну функцию, которая вызовет другую функцию. Итак, почему нам нужно использовать декораторы.
Я уже пытался сделать две программы
с декораторами
def decor_result(result_as_argument):
def new_function(marks):
for i in marks:
if i>= 75:
print("Congrats distiction",i)
else:
result_as_argument(marks)
return new_function
@decor_result
def result(marks):
for i in marks:
if i >= 35:
pass
else:
print("Fail")
break
else:
print("Pass")
result([79,65,55,78,12])
без декораторов
def result_distict(marks):
for i in marks:
if i>= 75:
print("Congrats distiction",i)
else:
result(marks)
def result(marks):
for i in marks:
if i >= 35:
pass
else:
print("Fail")
break
else:
print("Pass")
result_distict([79,65,55,78,12])
result([79,65,55,78,12])
Делая это, я узнал, что без использования декораторов это более упрощено, и мы можем использовать любую функцию, какую захотим, а с помощью декораторов мы не можем использовать старую функцию, так зачем и где использовать декораторы?
Чтобы расширить, совсем чуть-чуть; речь идет о шаблонах. Когда вы хотите сделать одно и то же расширение для нескольких функций, декоратор пишется только один раз, а затем применяется снова и снова, в то время как более наивный подход требует, чтобы каждая функция была обернута одним и тем же кодом, т. е. вам нужно повторяться.






В вашем примере делать декоратор не нужно. Вы хотите использовать декоратор, когда пытаетесь реализовать определенное поведение для набора функций. Например, допустим, вы пытаетесь отобразить время выполнения всех функций в вашем скрипте.
Решение 1) Вы добавляете небольшой фрагмент кода везде, чтобы отобразить его:
from time import time
def f1():
t0 = time()
# f1 body
print("Execution time of f1: {}".format(time()-t0))
def f2():
t0 = time()
# f2 body
print("Execution time of f2: {}".format(time()-t0))
Как видите, код очень повторяющийся. Если вы хотите что-то изменить в этом общем поведении, вам нужно изменить все функции. Вот где декоратор полезен.
2) Использование декораторов:
def timer(func):
def wrapper(*args,**kwargs):
t0 = time()
res = func(*args,**kwargs)
duration = time()-t0
print("Execution time of {}: {} s".format(func.__name__, duration))
return res
return wrapper
@timer
def f1():
# body of f1
@timer
def f2():
# body of f2