(一)装饰器的形成过程
装饰器的本质是闭包函数的一种应用,装饰器是用来装饰函数的,在不修改原函数及其调用方式的情况下对原函数功能进行拓展。
#简单的无参函数装饰器 import time def timmer(func): def inner(): start = time.time() func() end = time.time() print(end -start) return inner @timmer#语法糖 def hahaha(): time.sleep(2)#停止时间的一种用法 print("a") hahaha()
#简单的有参函数装饰器 import time def timmer(func): def inner(x,y): start = time.time() func(x,y) end = time.time() print(end -start) return inner @timmer def hahaha(a,b): time.sleep(2)#停止时间的一种用法 print("aaa") hahaha(1,2)
#简单的带返回值的装饰器 import time def timmer(func): def inner(*args,**kwargs): start = time.time() se = func(*args,**kwargs) end = time.time() print(end - start) return se return inner @timmer def func2(a): print("in func and get a:%s"%(a)) return "fun2 over" func2([1,2,3,4,5])
装饰器的主要功能和装饰器的固定结构
装饰器的主要功能:
在不改变原函数及其调用方式的基础上在函数的前,后增加功能。
装饰器的固定格式:
#完美的装饰器格式 def wrapper(func): def inner(*args,**kwargs): '''执行之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner
带参数的装饰器
#装饰器多层嵌套 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print("执行函数前要做的") re = func(*args,**kwargs) if flag: print("执行函数后要做的") return re return inner return timer @outer("hello world")#装饰器也可传参 def func(a,b): print(111) func(1,3)
开放封闭原则
1,对扩展是开放的,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何修改。所以我们必须允许代码扩展,添加新功能。
2,对修改是封闭的,我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其修改了,很有可能影响其他已经在使用该函数的用户。
装饰器完美遵循了这个开放封闭的原则。
多个装饰器装饰同一个函数
def wrapper1(func): def inner(): print("wrapper1,before func") func() print("wrapper1,after func") return inner def wrapper2(func): def inner(): print("wrapper2 ,before func") func() print("wrapper2,before func") return inner @wrapper1 @wrapper2 def f(): print("in f") f()