闭包和装饰器

1、闭包:

如果一个函数,内部又嵌套了一个函数,且这个内部函数用到了外部函数的局部变量,外部函数将内部函数作为返回值赋给任意一个变量a(相当于内部函数的地址传递给a),那么在调用函数a(),则可以访问到外部函数的局部变量,局部变量可以在函数外部被访问而不会被垃圾回收,直到这个局部变量没有对象使用为止,这种现象称为闭包。其实闭包的一个作用就是保存局部变量,在函数运行结束时不会马上被垃圾回收。举个简单的例子:

闭包的优缺点:

1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成

2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

2、装饰器:

装饰器,装饰器是闭包现象的一种体现,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。比如java中的动态代理,python的注解装饰器,其实python的装饰器,是修改了代码。

先来举一个简单的例子,假如公司以前基础平台的开发人员在写代码时候没有关注验证相关的问题,即:基础平台的提供的功能可以被任何人使用。现在需要对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。如果让调用功能的人员自行添加验证的部分,那么每个调用功能的人员都需要自己添加,且不统一,并且非常费事费力。那么这是装饰器就起到了一个很好的作用,基础平台开发人员只需要另外写一个具有验证信息功能的装饰器,几乎不需要改动之前的代码,就可以使每个调用功能的人员在调用该功能之前都有验证的部分,十分方便。

装饰器的工作流程:

1、简单的装饰器:

此时test1打印了,test2并没有打印
调用alter函数

2、多个装饰器:

多个装饰器,按照从里往外(从下往上)的先后顺序执行,可以理解为先写后运行,先写后结束。

3、带参数的装饰器:

带参数的装饰器可以对装饰器内部的业务逻辑做一些选择,相当于闭包的嵌套

再来一个例子:

4、装饰器示例:

例1:

例2:

例3:

例4:

例5:

例6:被装饰的函数有返回值

没有接收foo函数的返回值,所有其return没有作用,为了通用起见,在inner函数内部接收func函数的返回值。

下面的例子帮助更好的理解装饰器的执行过程:

通用装饰器:

5、类装饰器:

在python中,变量名()这种方式通常表示的是调用变量名的这种类或方法,想类,函数都是可以调用的,但实例对象虽然具有类的方法和属性,但是却是不可调用的,如下图中,Dog类可以调用,erha这个实例对象不可调用。

造成上述的现象是因为class也属于对象,它是内置的type类的对象,type类中具有__call__这一魔法方法,因此Dog类可以被调用,erha是Dog类的实例对象,而Dog类中没有__call__的魔法方法,因此erha这一实例对象不可被调用,若要erha这一实例对象,需在Dog类中加入__call__的魔法方法

运行如下代码:

从结果可以看出,此时laowang的id和实例对象self的id是一样的,就说明了laowang就是这一实例对象,func指向了laowang原本的函数体

从结果可以看出,类装饰器不仅可以使实例对象可调用,并且实现了在类的外部访问类的私有属性的功能。

例:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容