闭包函数/装饰器

时间:2022-11-01 22:46:19

一.闭包函数

闭包函数:内部函数包含对外作用域而非全局作用域的引用

作用:传参(通过参数的形式,通过闭包函数)

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


顺序:装饰的时候从下到上执行

闭包函数/装饰器