python之闭包原理

迭代器,生成器,装饰器,号称python的三大利器。今天,来谈谈三大利器之一的装饰器。

所谓装饰器,就是在不改变一个函数内部代码的前提下,给函数额外增加功能的东西。装饰器本质就是一个嵌套函数。

要实现装饰器的功能,就不得不提到闭包这个东西了。

闭包,通俗来说,就是一个函数形式,它可以拥有自己的一些属性和方法,但仅限于自己定义的,而不会像类那样,拥有继承自object的所有属性和方法。最简单的闭包实现需要嵌套两层函数,比如下面这个demo:
def closure(func): # 将函数的引用当做形参传进内层函数,内层函数调用
    def demo():
        func()
        print("hello closure")
        return True
    return demo

在上面这段代码中,外层函数closure的返回值是内层函数demo的引用,内层函数调用了外层函数得到的参数,并实现了一些功能。
如果closure(func)中传入的参数是另一个函数的引用,就可以在demo()中实现该func的调用,这样一来,一个装饰器就实现了。
== 这其中,最关键的一点是:外层函数要返回内层函数的引用,并且要传入外界函数的引用==

下面这段代码完整展示了一个装饰器的定义和作用实现:

# -*- coding: utf-8 -*-

def closure(func): # 将函数的引用当做形参传进内层函数,内层函数调用
    def demo():
    	print("hello closure!")
        func()        
    return demo
def test1():
	print("hello world!")
	
@closure
def test2():
    print("hello world!")

# 上面的@等价于下面这句
# test = closure(test)
test1()
print("-------------")
test2()

执行@closure具体过程是:
首先找到test2,然后把test2当做实参传递给closure(),这样,demo()就可以通过func,调用test2。所以整个过程就表现为:先把closure给执行了,然后test2这个变量被重定向到了demo。

最后运行结果就是:

hello world
-------------
hello world!
hello closure!

特别的:装饰器并不是在函数电泳的时候开始执行,而是在函数定义后就开始装饰函数了。下面这段代码说明了这个道理|:

# -*- coding: utf-8 -*-

def closure(func): # 将函数的引用当做形参传进内层函数,内层函数调用
    print("开始装饰")
    def demo():
        print("hello closure")
        func()
    print("装饰完成")
    return demo

def test1():
    print("hello world")

@closure
def test2():
    print("hello world!")


运行结果是这样的:
在这里插入图片描述
具体效果读者可自行尝试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值