python装饰器与闭包_python闭包与装饰器
本文针对: 学不会,学过即忘,学完跑路 的相关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闭包与装饰器相关推荐
- python grpc unary call错误_python的黑魔法-装饰器
python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...
- python装饰器类型错误_Python各种类型装饰器?一起看看这份详解说明吧
装饰器说明Python中的装饰器是一种可以装饰其它对象的工具. 该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现. 装饰器本身需要接受一个被装饰的对象作为参数,该 ...
- python怎么闭包_Python闭包
Python闭包教程 闭包就是一个 在 闭包的记忆功能 在 Python 中,被捕获到闭包中的变量让闭包本身拥有了记忆效应,闭包中的逻辑可以修改闭包捕获的变量,变量会跟随闭包生命期一直存在,闭包本身就 ...
- python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...
1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...
- python函数装饰器详解_Python语言函数装饰器用法实例详解
这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...
- python 闭包_Python 闭包
所谓闭包,有2中定义. 1.子函数可以使用父函数中的变量 2.一个变量引用者未释放的可执行的代码块. 对第1点先举例: def line_conf(): def line(x): return 2*x ...
- python tkinter 循环显示文本_Python简易音乐播放器
上一篇介绍了点阵字展现动态歌词,后续的思路有一条是添加图形界面.这两天搜了下tkinter图形界面的帖子,做了个简单的播放器界面,听首<盗将行>感受下效果吧 Python图形界面 图形界面 ...
- python资源管理器选择文件_Python:在资源管理器中获取选定文件的列表(windows7)...
我知道现在在这里发布答案有点晚了,但我几个月前尝试过Olav的解决方案,但它没有完全起作用:工作目录是脚本的工作目录,所以我不得不删除if条件才能使其工作,但它选择了所有Windows资源管理器窗口中 ...
- python装饰器与闭包_Python 装饰器和闭包
Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...
最新文章
- html5游戏加载动画,HTML5 战场3游戏的加载指示动画
- Android中几种常用的定时器和延时方法
- iptables规则备份和恢复,任务计划chkconfig工具systemd管理服务
- linux关闭方防火墙的命令
- LLVM4更新--简化对象定义
- ControlStyles(枚举)
- 怎么能把你的公司快速做大呢
- javascript 数组过滤重复对象
- Struts2 中的值栈的理解
- SIR传染病模型及matlab代码
- PySide6开发环境
- 前序、中序、后序排列
- HTML-form表单
- 使用python讲二进制转换为音频文件_Python使用ffmpy将amr格式的音频转化为mp3格式的例子...
- 红旗系统linux2.6.32屏保咋设置,红旗Linux桌面操作系统 V11社区预览版发布,附新特性介绍...
- 国内终端安全防护市场报告发布 360网神排行第一
- 各国制度、文化距离-原始数据+测算数据(2003-2018年)
- 开手机私服,服务器配置参考事项
- STM32F407 freemodbus移植
- 什么是功率因数?看完你就懂了