本文针对: 学不会,学过即忘,学完跑路 的相关python人群.

一.Python闭包

定义: 访问了定义体以外的定义的非全局变量.(刚学时看不懂这句话太TM正常了)

定义解析: 其实就是函数里面再定义一个函数,里层函数引用了外层函数的变量,这就是闭包.

1 defwrapper():2 whatever = 'abandon'

3 definner():4 print(whatever)5 print(inner.__closure__) #闭包: (,)

6

7 wrapper()

最简单闭包形成

这里需要说明的是闭包形成与否和是否返回内存函数并无直接关系,只是这样我们就无法运用闭包了,所以正常情况下必须返回.

二.Python装饰器

1.这玩意有什么用

装饰器,装饰器,自然是装饰东西用的.这里的"东西"即是python中的一等公民--函数.

2.函数为什么需要装饰

这个说起来话就长了,这里长话短说,总结成一句话: 中心思想: 简单省事以及--别动老子代码.

3.装饰器的作用

这里引入一个软件设计的原则:

开放封闭原则--对扩展代码的功能是开放的,但是对修改源代码是封闭的.(即功能你可以加,但是代码您可别动...)

那么python中怎么去实现呢--装饰器啊!

4.装饰器的写法和引用

a.装饰器需要用到闭包;

b.装饰器需要返回内存函数;

c.装饰器使用"@"符号调用;

ex:

1 def zsq(func): #zsq: decorator的拼音

2 definner():3 print('卧槽!') #加一个热血沸腾的语气词

4 func()5 returninner6

7 @zsq #调用装饰器

8 defhaoyougei():9 print("你不要过来啊!")10

11 @zsq #调用装饰器

12 defaduogeng():13 print("为什么是你!")14

15 @zsq #调用装饰器

16 defaxiba():17 print("居然是你!")18

19 axiba()20 aduogeng()21 haoyougei()22

给函数加个文明的语气词

如上述代码,为了防止定义的函数被再次更改代码(以及简单方便),使用@调用装饰器是事半功倍的方法.

5.装饰器的特性:

a.能把被装饰的函数替换成其他函数;

所以上面代码可以理解为:

axiba = zsq(axiba)

axiba()

aduogeng = zsq(aduogeng)

aduogeng()

haoyougei = zsq(haoyougei)

haoyougei()

b.装饰器函数在加载模块上立即执行,不需要函数调用.(这一点请自行测试)

三.Python装饰器进阶

看了上面的部分后如果了解python函数的你在写代码时就可能发现下面的两个问题:

1.被装饰的函数有传参怎么办?

2.定义的装饰器想传参怎么办?

这里引用一下上面的例子:

① axiba = zsq(axiba)

② axiba()

①里面的执行完成后,axiba为zsq返回的inner,调用axiba()时执行的为inner(),此时内存中func保存为axiba,所以执行func()即为执行axiba();

若axiba有传参,如axiba(*args),则func中参数应该为*args,即func(*args),而func的传参需要从inner中传入,所以写为inner(*args).

所以由上得出, 被装饰的函数有传参时,应该设置在里层函数中,如下:

1 def zsq(func): #zsq: decorator的拼音

2 def inner(*args, **kwargs): #(*args, **kwargs)表示接受所有传参

3 print('卧槽!') #加一个热血沸腾的语气词

4 func(*args, **kwargs)5 returninner6

7 @zsq #调用装饰器

8 defhaoyougei(name):9 print("你不要过来啊!{}".format(name))10

11 @zsq #调用装饰器

12 defaduogeng(name):13 print("为什么是你!{}".format(name))14

15 @zsq #调用装饰器

16 defaxiba(name):17 print("居然是你!{}".format(name))18

19

20 #axiba = zsq(axiba)

21 axiba('张益达')22 #aduogeng = zsq(aduogeng)

23 aduogeng('律政先锋')24 #haoyougei = zsq(haoyougei)

25 haoyougei('斯内克')

被装饰的函数拥有传参

解决了一个问题,还剩一个问题,其实第二个问题算是功能性问题--为了实现一些功能而出现的,不然一个正常人不会想到给装饰器传什么参数.

怎么解决呢,其实实现起来非常简单,但是原理有一点绕: 想想上面第一个问题的参数是如何加进去的--最里层调用的函数(func)需要传参,则给其所在层的函数(inner)加上了传参.那么当装饰器函数(zsq)需要传参时,我们给其包装一层函数,并在包装函数上设置传参不就可以了.

所以,当定义的装饰器需要传参时,需要在外层再设置一层包装函数,并将包装函数设置好传参,最后将装饰器函数返回.

1 def decorator(flag=True): #给装饰器设置一个参数: 形成一个开关

2 def zsq(func): #zsq: decorator的拼音

3 def inner(*args, **kwargs): #(*args, **kwargs)表示接受所有传参

4 print('卧槽!') #加一个热血沸腾的语气词

5 if flag: #使用外部flag标签实现逻辑功能

6 func(*args, **kwargs)7 else:8 print('溜了溜了~')9 returninner10 return zsq #返回装饰器,zsq才是真正的装饰器,decorator是其包装

11

12 @decorator() #调用装饰器decorator ***** 调用的是最外层的包装

13 defhaoyougei(name):14 print("你不要过来啊!{}".format(name))15

16 @decorator(flag=False) #调用装饰器decorator ***** 调用的是最外层的包装

17 defaduogeng(name):18 print("为什么是你!{}".format(name))19

20 @decorator() #调用装饰器decorator ***** 调用的是最外层的包装

21 defaxiba(name):22 print("居然是你!{}".format(name))23

24

25 #axiba = zsq(axiba)

26 axiba('张益达')27 #aduogeng = zsq(aduogeng)

28 aduogeng('律政先锋')29 #haoyougei = zsq(haoyougei)

30 haoyougei('斯内克')

装饰器的传参实现

到这里基本上算是将python装饰器的基本概念和实现说明完毕,另提一嘴from functools import wraps,想多了解的话google一下吧.

自己写4到5个装饰器,基本上就初步掌握了.

The End!

python装饰器与闭包_python闭包与装饰器相关推荐

  1. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  2. python装饰器类型错误_Python各种类型装饰器?一起看看这份详解说明吧

    装饰器说明Python中的装饰器是一种可以装饰其它对象的工具. 该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现. 装饰器本身需要接受一个被装饰的对象作为参数,该 ...

  3. python怎么闭包_Python闭包

    Python闭包教程 闭包就是一个 在 闭包的记忆功能 在 Python 中,被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包生命期一直存在,闭包本身就 ...

  4. python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...

    1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...

  5. python函数装饰器详解_Python语言函数装饰器用法实例详解

    这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...

  6. python 闭包_Python 闭包

    所谓闭包,有2中定义. 1.子函数可以使用父函数中的变量 2.一个变量引用者未释放的可执行的代码块. 对第1点先举例: def line_conf(): def line(x): return 2*x ...

  7. python tkinter 循环显示文本_Python简易音乐播放器

    上一篇介绍了点阵字展现动态歌词,后续的思路有一条是添加图形界面.这两天搜了下tkinter图形界面的帖子,做了个简单的播放器界面,听首<盗将行>感受下效果吧 Python图形界面 图形界面 ...

  8. python资源管理器选择文件_Python:在资源管理器中获取选定文件的列表(windows7)...

    我知道现在在这里发布答案有点晚了,但我几个月前尝试过Olav的解决方案,但它没有完全起作用:工作目录是脚本的工作目录,所以我不得不删除if条件才能使其工作,但它选择了所有Windows资源管理器窗口中 ...

  9. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

最新文章

  1. html5游戏加载动画,HTML5 战场3游戏的加载指示动画
  2. Android中几种常用的定时器和延时方法
  3. iptables规则备份和恢复,任务计划chkconfig工具systemd管理服务
  4. linux关闭方防火墙的命令
  5. LLVM4更新--简化对象定义
  6. ControlStyles(枚举)
  7. 怎么能把你的公司快速做大呢
  8. javascript 数组过滤重复对象
  9. Struts2 中的值栈的理解
  10. SIR传染病模型及matlab代码
  11. PySide6开发环境
  12. 前序、中序、后序排列
  13. HTML-form表单
  14. 使用python讲二进制转换为音频文件_Python使用ffmpy将amr格式的音频转化为mp3格式的例子...
  15. 红旗系统linux2.6.32屏保咋设置,红旗Linux桌面操作系统 V11社区预览版发布,附新特性介绍...
  16. 国内终端安全防护市场报告发布 360网神排行第一
  17. 各国制度、文化距离-原始数据+测算数据(2003-2018年)
  18. 开手机私服,服务器配置参考事项
  19. STM32F407 freemodbus移植
  20. 什么是功率因数?看完你就懂了

热门文章

  1. gecco爬虫初见与综述
  2. 网格化巡查二维码的意义及应用
  3. Python实战技巧(10)Python解析邮件
  4. (连载)边喝咖啡边学Unity——第二章 预备知识体系
  5. Python asyncio
  6. while(++i)与 while(i++)
  7. vue.js(初识)
  8. 数据库中的多值依赖的理解
  9. 关闭页面代码和弹出窗口,出现确定,取消按钮+执行
  10. 晒一下我和老婆的婚纱照!