装饰器 装饰器就是闭包函数的一种应用场景一 为什么要用装饰器 #开放封闭原则:对修改封闭,对扩展开放二 什么是装饰器 装饰器他人的器具,自己能够是任意可调用对象,被装饰者也能够是任意可调用对象。 强调装饰器的原则: 1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能三 装饰器的使用 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): #func是被装饰的对象,这里能够写执行前的功能 res=func(*args,**kwargs) # 这里能够写执行后的功能 return res return wrapper @装饰器名字 #被装饰的函数名字 = 装饰器名字(被装饰的函数内存地址) def 被装饰的函数名字(): pass 2. 有参装饰器 def 装饰器名字(参数1,参数2,...): def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper return outter @装饰器名字(值1,值2,...) #@outter def 被装饰的函数名字(): pass3. 语法糖:在被装饰对象正上方单独一行写 无参:@装饰器的名字 有参:@装饰器的名字(arg1,arg2,...) @timmer # index=timmer(index) def index(): pass @auth2(engine='file') # @名字 # index=名字(index) def index(): pass 叠加多个装饰器 @deco1 @deco2 @deco3 def index(): pass 解释语法的顺序:自下而上,deco3=》deco2=》deco1 调用index()时才开始触发装饰器内部闭包函数的执行,闭包函数执行顺序是:自上而条, deco1.wrapper1=>deco2.wrapper2=>deco3.wrapper3 wrapper.__name__=func.__name__ (函数名字赋值) wrapper.__doc__=func.__doc__ (注释的内用赋值#)