什么是装饰器:可以理解为添加新的功能。定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。装饰器形成的过程 *args 接收:聚合 调用:打散import timeprint(time.time())time.sleep(3)#让程序执行到此位置的时候停留print('vhdihfiufhui')def timer(f):#计算函数的执行时间 start = time.time() f() end=time.time() print(end-start)def func(): time.sleep(1) print('hahahhah')timer(func)装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质是:闭包原则:开放封闭原则
1.对扩展是开放的
2.对修改是封闭的
装饰器的固定模式def func(): time.sleep(2) print('哈哈哈哈哈')def timmer(func): #闭包 ----》指向func的内存地址 timmer就是一个装饰器函数 def inner(): start=time.time() func() #被装饰的函数 end=time.time() print(end-start) return innerfunc=timmer(func) #先执行后面的function就是第一个函数func() #实际执行innnertimmer就是一个装饰器函数,只是对一个函数,有一些装饰作用不想修改函数的调用方式,但是还想在原来的函数前后添加功能,so 使用装饰器语法糖:使代码更便捷@timmer(装饰器函数的名字) 写在被装饰的函数的上面 这个就相当于:func=timmer(func)练习:def wrapper(func):# 传入func:被装饰的函数 ***** def inner(*args,**kwargs): print('在被装饰的函数之前做的事') ret=func(args,**kwargs) #func被装饰的函数 参数是inner传给他的 print('在被装饰的函数执行之后做的事') return ret return inner@wrapper #holiday=wrapper(holiday)def holiday(day): print('放假%s'%day) return '哈哈哈哈哈'ret=holiday(3) #调用holidayprint(ret)#装饰器的固定格式一:def timmer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re=func(*args,**kwargs) '''执行函数之后要做的''' return re return inner 装饰器的固定格式二---wrappet版from functools import wrapsdef deco(func): @wraps(func)#加在最内侧函数最上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper装饰器的进阶 functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数def haha(): print('hahah')'''一个打印哈哈的函数'''print(haha.__name__)#查看函数(字符串)名print(haha.__doc__)#查看文本的函数加入:from functools import wraps@wraps(func)能查看函数的名字和文本 而不是装饰器的信息