做网站虚拟主机多少钱,查询企业年报的网站,佛山做优化的公司,企业网站开发框架为什么用装饰器#xff1f;
第一个原因是#xff0c;使用装饰器可以提升代码复用#xff0c;避免重复冗余代码。如果我有多个函数需要测量执行时间#xff0c;我可以直接将装饰器应用在这些函数上#xff0c;而不是给多个函数加上一样的代码。这样的代码既元余也不方便后…为什么用装饰器
第一个原因是使用装饰器可以提升代码复用避免重复冗余代码。如果我有多个函数需要测量执行时间我可以直接将装饰器应用在这些函数上而不是给多个函数加上一样的代码。这样的代码既元余也不方便后面维护第二个原因是使用装饰器可以保证函数的逻辑清晰。如果一个本身功能就很复杂的函数我还要通过修改内部代码来测量运行时间这样会模糊函数自身的主逻辑。同时软件开发的一个原则就是单一职责也就是说一个函数只应该承担一项责任第三通过装饰器我们可以扩展别人的函数。想象我们正在使用一个第三方库的函数但我要添加额外的行为比如测量运行时间那我就可以用装饰器去包装而不是跑到库里面去修改。
import time
import math#函数接收的参数为函数
def mysqrt(x):return math.sqrt(x)def print_running(f,x):print(f{f.__name__} is running)return f(x)result print_running(mysqrt,9)
print(result)
mysqrt is running 3.0
#基本的装饰器例子import time
def myDecorator(func):def warpper(*args,**kwargs):start_timetime.time()resultfunc(*args,**kwargs)end_timetime.time()print(f{func.__name__} running time :{end_time-start_time})return resultreturn warpperdec_mysqrtmyDecorator(mysqrt)
resultdec_mysqrt(9)
print(result)#使用语法完成函数名字上面代码段的dec_mysqrtmyDecorator(mysqrt)替换
myDecorator#函数接收的参数为函数
def mysqrt(x):return math.sqrt(x)xmysqrt(10)
print(x)mysqrt running time :0.0 3.0
#装饰器生成器比如要要测量某函数运行时间是否超过阈值但不同函数的阈值是不一样的所以需要定义多个装饰器应对不同阈值吗不只需要用装饰器生成器
def timer(threshold):def decorator(func):def warpper(*args,**kwargs):start_timetime.time()resultfunc(*args,**kwargs)end_timetime.time()if (end_time-start_timethreshold):print(f{func.__name__} running time is over {threshold} seconds)return resultreturn warpperreturn decoratortimer(0.2)
def sleep_04():time.sleep(0.4)# #上述写法的等价写法
# def sleep_04():
# time.sleep(0.4)
# sleep_04 timer(0.2)(sleep_04)sleep_04()
print(sleep_04.__name__)
sleep_04 running time is over 0.2 seconds warpper
#但是上面的代码的sleep_04.__name__是warpper不是sleep_04。
#能继承函数名字等参数的装饰器生成器import functools
def timer(threshold):def decorator(func):functools.wraps(func)def wrapper(*args,**kwargs):start_timetime.time()resultfunc(*args,**kwargs)end_timetime.time()if (end_time-start_timethreshold):print(f{func.__name__} running time is over {threshold} seconds)return resultreturn wrapperreturn decoratortimer(0.2)
def sleep_04():time.sleep(0.4)
# #上述写法的等价写法
# def sleep_04():
# time.sleep(0.4)
# sleep_04 timer(0.2)(sleep_04)sleep_04()
print(sleep_04.__name__)sleep_04 running time is over 0.2 seconds sleep_04