Python学习日记-为什么装饰器建立在闭包的基础上

因为昨晚刚写的那篇博客,今天上午起来就跑了一遍代码,终于弄得更清楚了一些

那么装饰器为什么要建立在嵌套函数上呢

我们有必要提一下闭包的特点:

1.嵌套
2.返回内层函数
3.有私有变量

还是,以昨晚的例子来看:

def world(fn):
	fn()
    print('world')
    return fn


@world
def hello():
    print('hello')

这里单独运行hello()函数的时候,只会打印hello。因为,返回值就是hello本身。那么我们将world()函数作为函数返回呢?是不是就会打印出hello world呢?

def world(fn):
	fn()
    print('world')
    return world


@world
def hello():
    print('hello')

运行hello()会报错,因为这时候hello已经被替换为world,因此缺少一个参数。但是,这个参数应该是什么呢?原来的hello()已经没有了,现在的world与hello指向同一个函数。把任意一个当做参数传入,运行hello(world/hello),会一直提醒缺少一个参数。
所以,一层函数无论返回什么,都无法实现完整的功能。
那我们引入闭包,使用嵌套呢?

def world_out(fn):
    def world_in():
        fn()
        print('world')

    return world_in
    
@world_out
def hello():
    print('hello')

hello()

这是前面一篇博客里面提到的代码。
我们将额外的print()语句封装到了内层函数,接着返回内层函数。这样原来的函数名就指向新的拥有完整功能的函数了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值