装饰器

多层装饰器

语法糖会将紧挨着的被装饰对象的名字作参数自动传入装饰器函数中

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')

imgimg

有参装饰器

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

image-20221012161941040.png

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

image-20221012162926946.png

一样的套路,如果确定了中间和最内的两层函数的参数不可改变,那么就只能同闭包投食的方式,在最外层函数投参数给他们,然后将中间层函数返回,这样在全局中可以拿到中间层函数,而拿到中间层函数就可以调用拿到最内层的函数了,此时参数都已经完成了传递

"""
真正的核心逻辑在最内层,中外层的目的都是传参,就像火箭燃烧助推完后,都要一级一级分离,把最顶部的卫星送入太空,中外层是手段,内层是核心逻辑
"""

装饰器模板

两层无参装饰器(常用)

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来修复装饰器装饰后的函数的名称等属性发生的变化。

image-20221012171432305.png

递归函数

一个函数内部,调用了自己,循环往复

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

点击查看图片来源

posted @ 2022-10-12 18:30  吴仁耀  阅读(61)  评论(0)    收藏  举报