装饰器、闭包笔记

#装饰器、闭包笔记
闭包函数,可能在函数删除后,需要用到这个函数的变量(闭包结决这个问题)
#闭包的定义:在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回内部函数 我们把这个使用外部函数变量的内部函数称为闭包

  • 闭包形成条件:
    1.实现函数嵌套
    2.内部函数使用外部函数的变量
    3.外部函数返回内部函数名字

#简单例子:

def test1():
    b=1
    def test2():
    	a=b+10
        print(b)
    return test2() 
    # 这里的'()'会导致报错'NoneType' object is not callable
    # 只要去掉wrapper后面的括号即可解决问题

a=test1()
a()

注意,正确的是返回 test2,不然会报错‘不可调用’
过程: 程序从上往下运行,到调用函数的时候运行,调用test1(),test1()函数运行
test1函数不会运行到test2函数,因为test2函数没有被调用,
返回test2,返回的test2给到test1了,这时a=test2
然后a(),就是test2(), 运行test2函数

例子2

#拿到函数的变量,在另一个函数中计算
def test1(n1):
    def test2(n2):
        sum = n1 * n2
        print(sum)
    return test2
    
result = test1(3)
result(2)

执行过程类似上个例子

例子3
现有一评论功能,流程是登录,检查登录,发表评论;只有登录完成后才能发表评论
#闭包流程,先写了发表评论的部分,就是发表评论后–检查登录,登录后再去调用评论(把评论函数作为参数传进去)
这样才满足闭包的条件

def check(a):
    print('检查登录')
    def inner():
        print('登录')
        a()
    return inner

def comment():
    print('发表评论')

c = check(comment)
c()

过程:从上到下开始走,走到check(comment)开始执行函数 ,fc 是comment 输出检查
到inner 不会被执行,走到return这里 返回一个inner,这个inner被check接收 check(comment)赋值给 c 所以c就是 inner
inner()就变成了一个调用函数 走到inner函数中 打印 登录 fc()
fc是comment 相当于 comment()

总结:给已有的函数增加额外的功能 不修改已有的函数的源代码

#装饰器 @方法名
定义:是给已有的函数增加额外的功能 本质是一个闭包函数

def check(a):
    print('检查登录')
    def inner():
        print('登录')
        a()
    return inner

@check
#相当于 check(comment)
def comment():
    print('发表评论')

comment()

过程:先走@check,这个相当于check(comment),输出 检查登录,
到inner不执行,return inner给comment()函数,现在comment相当于是inner
执行inner 走到登录,输出登录, a()是comment() ,输出发表评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值