闭包和装饰器

闭包

定义: 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
构成条件:
1 在函数嵌套(函数里面在定义函数)的前提下
2 内部函数使用了外部函数的变量(还包括外部函数的参数)
3 外部函数返回了内部函数

执行流程
先调用 func_out()函数,执行name的赋值, 定义func_in函数没有执行函数
然后把值return给f接收此时 f为 func_in方法 然后进行f()函数的调用.输出name值
上面流程func_in最初只是定义了方法,并没有执行.
后面调用f() 本质就是调用fun_in函数输出打印

栗子
# 闭包形式 外部函数定义自己的逻辑   内部函数接着处理外部函数的数据   后面调用直接接受内部函数对象

def func_out():
    # 函数func_out定义了一个name 变量
    name = 'zed'

    def func_in():
        #  第二个函数 func_in使用 func_out的变量
        print(name)

    # 将第二个函数名 返回
    return func_in

f = func_out()
f()

装饰器

本质 :两次返回,两次调用

定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。

装饰器的功能特点:

不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能

装饰器调用流程
首先调用 comment 本质调用func2,fun2的data接收的是装饰函数的参数,然后打印登录判断
再调用func(data)函数,本质是调用 装饰函数 comment()函数 然后进行打印用户评论 完事comment调用结束断电回到func(data).
整体调用结束 回到comment函数 ,调用结束

栗子
#  使用装饰器,在评论之前增加用户登录判断
def func1(func):
    # 需要定义一个参数func,接收函数
    # 本质上接收的是需要装饰的函数
    def func2(data):
        # 增加新功能
        print('登录判断')
        # 调用装饰的函数
        func(data)
    return func2
@func1
def comment(data):
    # data 参数接收用户的评论信息进行展示
    print(f'用户评论:{data}')
#  调用用户评论方法
comment('整挺好')

注意: 闭包函数有且只有一个参数,必须是函数类型,这样定义的函数才是装饰器。

装饰器传递参数

本质 :三次调用 三次返回

调用流程:
先调用装饰器函数(zhuangshiqi()),接受参数 ,执行函数的方法.又定义了func_out函数,只定义并没有执行,返回func_out函数 ,
装饰器接受 func_out函数 ,再调用func_out函数,执行func_out函数 执行函数方法,定义了func_in函数,不执行func_in函数.
再返回fun_in函数 ,装饰器接收func_in函数 调用func_in函数并执行 结束

def zhuangshiqi(data):
    # data接收装饰器的参数
    print(data)
    print('装饰器')
    def func_out(func):
        # func 接收装饰器的函数

        print('func_out')
        def func_in():
            print('func_in')
            func()  # 此时func接收的是 myfunc方法
        return func_in
    return func_out




# 装饰器
@zhuangshiqi('aaaaa')
def myfunc():
    print('myfunc')

# 不使用装饰器的调用方式
# f = zhuangshiqi('aaa')
# myfunc = f(myfunc)
# myfunc()

#使用装饰器的调用方式
myfunc()


# 输出结果:
# aaaaa
# 装饰器
# func_out
# func_in
# myfunc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值