闭包和装饰器的关系

因为最近想总结一下闭包和装饰器,有点细节总是理不顺,于是找了一下B站上播放量大的,其中一个下面评论很多都说讲的很好,但是我听了一下,关于闭包的地方讲解的就有明显错误。与fluent python和effective python上有矛盾,其实python cookbook上也没说一定是函数作为参数,只是说可以。但是B站有些视频讲解时,竟然说闭包一定是传入的参数是函数,其实这个就差远了。所以大家看一些东西时,最好还是看经典教材,毕竟网上一些讲解的视频,没有经过审核,再者讲解者自身水平参差不齐。

我们提供的服务有:网站建设、网站设计、微信公众号开发、网站优化、网站认证、蔡甸ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的蔡甸网站制作公司

总结后,发现装饰器真是个好东西,灵活方便。装饰器是通过闭包来实现的,可以这么说两者之间的关系。

fluent python 2nd中关于闭包的说法。

A closure is a function-let’s call it f – with an extend scope that encompasses variables referenced in the body of f that are not global variables nor local variables of f. Such variables must come from the local scope of an outer function which encompasses f. It does not matter whether the function is anonymous or not; what matters is that it can access nonglobal variables that are defined outside of its body.

闭包是一个函数 f +一个/些变量,这些变量在闭包内引用,但是不是global变量也不是f的局部变量。这些变量必须来自包含函数f的外部函数的局部区域。函数是不是匿名函数无所谓,关键是f可以访问那些定义在 f 外部的非全局变量。书中给了一个图例,很清晰,到底什么是闭包。

从这个图的定义来看,闭包是函数并且这个函数可以访问非global的自由变量。当然一般闭包首先涉及到嵌套函数(函数内有函数),也涉及到高阶函数(传入的参数是函数或者返回值是函数)。但是并不像有些人讲的那样,闭包一定是传入函数。

如下是闭包的一个典型用法,这里闭包外的函数没有参数的。

def make_averager():
    count = 0
    total = 0
    def averager(new_value):
        nonlocal count,total
        count += 1
        total += new_value
        return total/count 
    return averager   # 返回的是函数,带括号返回的函数运行结果
        
avg = make_averager()  # an object of function make_averager
print(avg.__name__) # the name is averager
avg(10)
avg(11)
res = avg(13)
res = avg(14)
print(res)

本文题目:闭包和装饰器的关系
分享链接:http://ybzwz.com/article/dsojosp.html