一。开放封闭原则
1.对扩展是开放的
任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了开放封闭原则。
二。函数的有用信息
def func(): ‘‘‘ 本函数主要用于绘图,实时接收数据 :return:返回给前端某标签 ‘‘‘ print(func.__doc__) print(func.__name__) func() # 结果: # 本函数主要用于绘图,实时接收数据 # :return:返回给前端某标签 # func
三。*args,**kwargs
def wrapper(func): def inner(*args,**kwargs): ‘‘‘执行函数前‘‘‘ ret = func(*args,**kwargs) ‘‘‘执行函数后‘‘‘ return ret return inner @wrapper def func(a,b,c,d): #接收函数时,加个*聚合 print(111) func(1,2,3,4) # f1(*[1,2,3,4]) #执行函数时,加个*打散
四。装饰器进阶
1.带参数的装饰器
flag = True def wrapper_out(flag): def wrapper(func): def inner(*args,**kwargs): ‘‘‘执行函数前‘‘‘ if flag: ret = func(*args,**kwargs) ‘‘‘执行函数后‘‘‘ print(222) return ret else: ret = func() return ret return inner return wrapper @wrapper_out(flag) #第一步是调用 wrapper_out(flag),接收到返回值wrapper def func(): #第二步是@wrapper,即func = wrapper(func) print(111) func() # 输出结果: # 111 # 222 # 当flag = False时,调用inner()时走else # 输出结果: 111
2.多个装饰器装饰一个函数
def wrapper1(func): def inner1(*args,**kwargs): ‘‘‘执行函数前‘‘‘ print(222) ret1 =func(*args,**kwargs) ‘‘‘执行函数后‘‘‘ print(333) return ret1 return inner1 def wrapper2(func): def inner2(*args,**kwargs): ‘‘‘执行函数前‘‘‘ print(555) ret2 = func(*args,**kwargs) ‘‘‘执行函数后‘‘‘ print(666) return ret2 return inner2 @wrapper1 @wrapper2 def func(): print(111) func() #运行到@wrapper1时此时不运行,走下一步 #运行到@wrapper2时,func = wrapper2(func),此时得到的是 func = wrapper2(func),返回值是inner2 ,即func---->inner2 #之后再运行到@wrapper1,即func = wrapper1(inner2),返回值是inner1,即func----->inner1 #接着调用func(),即调用inner1() # #再根据自上而下的运行规律即可以得到结果 # 输出结果: # 222 # 555 # 111 # 666 # 333