闭包与装饰器

1闭包

所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象。
闭包作用: 1.封装 2.代码复用
包括了外部函数的局部变量,这些局部变量在外部函数返回后也继续存在,并能被内部函数引用。

LEGB原则:
函数对变量进行引用时 按照 LEGB的顺序进行查找: 

L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域(解释器自动添加)

def funx(x):
    print('开始')
    def funy(y):
        print('内部函数')
        return x+y
    print('结束')
    return funy
x=funx(3)
print(x(4))

输出结果:
开始
结束
内部函数
7

2 装饰器

闭包和装饰器之间的关系: 装饰器其实是用闭包来实现的。
上文提到闭包的重要特性:封存上下文,这一特性可以巧妙地被用于现有函数的包装,从而为现有函数增加功能,此乃装饰器。
装饰器本质上也还是一个python函数,它可以让其他函数在不需要的做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的功能

引入日志
函数执行时间统计
执行函数前的预备处理
执行函数后的清理功能
权限校验等场景
缓存

一个函数同时被多个装饰器装饰的执行顺序

一个函数如果同时被多个装饰器装饰,由紧靠函数的装饰器先对函数进行装饰,然后返回的结果在给外层的装饰器去执行装饰,依次类推直到所有装饰器都装饰完成,最后会得到一个函数,在执行这个函数的时候,会先执行最外层装饰器的内容,在执行里面装饰器的内容。

def diguo():
    print("底锅50")
    return 50
def doupi(f):
    def caidan1():
        print("豆皮麻资10块")
        return 10+f()
    return caidan1
def xiangcai(f):
    def caidan2():
        print("香菜麻资5块")
        return 5+f()
    return caidan2

print('------------')
@doupi
@xiangcai
def diguo():
    print("底锅50")
    return 50
x=diguo()
print(x)

结果:
豆皮麻资10块
香菜麻资5块
底锅50
65

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值