来到装饰器上,我们都知道它是用来装饰功能的。 这意味着我们可以在现有功能上添加一些额外的功能,但是可以通过使用其他简单功能来完成,也可以调用一个功能,该功能将调用另一个功能。那么为什么我们需要使用装饰器。
我已经尝试制作两个程序
带有装饰器
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])
通过执行此操作,我知道无需使用装饰器就可以更加简化,并且我们可以随意使用我们想要的任何功能,而通过使用装饰器,我们不能使用旧功能,因此为什么以及在哪里使用使用装饰器?
答案 0 :(得分:1)
在您的示例中,不需要装饰。当您尝试对一组功能实现特定行为时,您想使用装饰器。例如,假设您试图显示脚本中所有函数的执行时间。
解决方案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