多层装饰器
语法糖会将紧挨着的被装饰对象的名字作参数自动传入装饰器函数中
def outterl(func1):
print('outterl')
def wrapperl(*args, **kwargs):
print('wrapperl')
res1 = func1(*args, **kwargs)
retern res1
return wrapperl
def putter2(func2):
print('outer2')
def wrapper2(*args, **kwargs)
print('wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3):
print('outter3')
def wrapper3(*args, **kwargs)
print('wrapper3')
res2 =func3(*args, **kwargs)
return res3
return wrapper3
@outter3
@outter2
@outter1
def index():
print('index')


有参装饰器
有参装饰器的定义和调用:

装饰器最多只需三层,从外到内分别是传参层,语法糖层,核心逻辑层,内两层的参数是固定不能动的,所有参数统一在最外层投给它。而传参调用最外层函数后,得到的是"拿到所需参数的"语法糖层,紧接着就跟以前两层的装饰器一样了。这样,每装饰一个函数,投递的参数都不一样,在执行被装饰函数时,实际执行的是对应的wrapper,这个wrapper的拿到的参数,就是最初装饰index时投给的参数。

一样的套路,如果确定了中间和最内的两层函数的参数不可改变,那么就只能同闭包投食的方式,在最外层函数投参数给他们,然后将中间层函数返回,这样在全局中可以拿到中间层函数,而拿到中间层函数就可以调用拿到最内层的函数了,此时参数都已经完成了传递
"""
真正的核心逻辑在最内层,中外层的目的都是传参,就像火箭燃烧助推完后,都要一级一级分离,把最顶部的卫星送入太空,中外层是手段,内层是核心逻辑
"""
装饰器模板
两层无参装饰器(常用)
def outer(func_name):
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
@outer
def index():
pass
三层有参装饰器(不常用)
def outer_plus(mode):
def outer(func_name):
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
return outer
@outer_plus('MySQL')
def func():
pass
装饰器修复技术
用@wraps来修复装饰器装饰后的函数的名称等属性发生的变化。

递归函数
一个函数内部,调用了自己,循环往复
其实递归函数和循环很类似
需要有初始化,自增,执行代码,条件判断的,不然技术一个没有尽头的递归函数,我们叫做死递归
