一.闭包函数
闭包函数:内部函数包含对外作用域而非全局作用域的引用
作用:传参(通过参数的形式,通过闭包函数)
def outter(): n=1 def inner(): x=n return x return inner a=outter() # 将inner的函数地址赋值给a a() # 执行inner函数
二.简易版装饰器
什么是装饰器:
给被装饰对象添加一个新的功能的工具
装饰器使用的原则(开放封闭原则):
开放:对功能的扩展开放
封闭:对源码,调用方式等修改的封闭
装饰器必须遵循的两个原则:
1.不可改变装饰对象源码
2.不改变装饰对象的调用方式
ps:装饰对象是个可调用对象(callable),装饰器也是个可调用对象
三.升级版装饰器
四装饰器语法糖
装饰器语法糖:就是在被装饰对象上方写上@+装饰器名称,这就相当于把临近的函数当作参数自动传入装饰器函数中
@outter # 会将inner当作参数传入调用outter def inner(): pass
五装饰器模板
无参装饰器:
from functools import wraps def outter(func): @wraps(func) def inner(*args,**kwargs): #执行被装饰函数前的操作 res = func(*args,**kwargs) #执行被装饰函数后的操作 return res return inner
有参装饰器
from functools import wraps def wrappers(name): def outter(func): @wraps(func) def inner(*args,**kwargs): if name == 'zhang': # 执行被装饰函数之前你可以做的操作 res = func(*args,**kwargs) # * **在实参中使用 # 执行被装饰函数之后你可以做到操作 return res return inner return outter
ps:其中用到装饰器修复技术起作用为:
1.返回原来函数的函数名
2.返回原来函数的注释
五.多层装饰器
from functools import wraps def outter1(func1): print('加载了outter1') @wraps(func1) def wrapper1(*args,**kwargs): print('执行了wrapper1') res1=func1(*args,**kwargs) return res1 return wrapper1 def outter2(func2): print('加载了outter2') @wraps(func2) def wrapper2(*args,**kwargs): print('执行了wrapper2') res2=func2(*args,**kwargs) return res2 return wrapper2 def outter3(func3): print('加载了outter3') @wraps(func3) # 放在内置函数正上方 def wrapper3(*args,**kwargs): print('执行了wrapper3') res3=func3(*args,**kwargs) return res3 return wrapper3 @outter1 # index = outter1(wapper2) @outter2 # wrapper2 = outter2(wrapper3) @outter3 # wrapper3 = outter3(最原始的index函数内存地址) def index(): print('from index')
结果是:
加载了outter3
加载了outter2
加载了outter1
执行了wrapper1
执行了wrapper2
执行了wrapper3
from index
顺序:装饰的时候从下到上执行