python学习之路(九)
这一节主要讲的是装饰器。装饰器是一个非常好用的,用于装饰已有函数的函数功能。
其优点是不用修改调用方式,还不用修改源代码。
他的思想是:函数既变量;高阶函数;嵌套函数。
现在来尝试写装饰器
![](http://img0.ph.126.net/b6y87IjDZ-SdpiZlLWLX0A==/6631984758399977556.png)
![](http://img1.ph.126.net/gLV6eiIuzoFRPRIRWumwRQ==/6631960569144158791.png)
![](http://img1.ph.126.net/0qN-XQ0dXfOfd6ibnyTz6w==/6632214556330208494.png)
import time def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco def foo1(): time.sleep(1) print('----------i am in foo 111----------') def foo2(): time.sleep(2) print('----------i am in foo 222----------') foo1 = timer(foo1)foo1() foo2 = timer(foo2)foo2()
def deco(func): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time))
外面套一层:
def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco
def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco
那现在要给 foo1 函数增加功能 就这样:
@timerdef foo1(): time.sleep(1) print('----------i am in foo 111----------')
@timerdef foo2(): time.sleep(2) print('----------i am in foo 222----------')
foo1() foo2()
![](http://img0.ph.126.net/4fA6i7CCKNPdkqkjWeVswg==/6632376184536764880.png)
![](http://img1.ph.126.net/ivR56sdyY2wXv3CODR0A2A==/6632036435446494754.png)
![](http://img1.ph.126.net/JHEghu1uGWTKk3Po40JCFQ==/6632152983679032880.png)
foo1() 这句是函数调用 这句调用直接引导到 deco 函数的定义
![](http://img2.ph.126.net/eiui67Z1RnaBGsFAaoPWxA==/6632381682094917482.png)
这是为什么呢? —— 因为刚才运行语法糖的时候 它实际上运行的是:
foo1 = timer(foo1)
它实际上就是把 timer 函数 赋值给 foo1 这个变量
所以 foo1 已经被替换成了 timer 所以调用 foo1 的时候 会去执行 timer
然后蹦到 def deco() 的时候 它也是一个定义 没有调用 跟上面说过的那样
它不执行中间的函数体 直接跳到 return deco 返回了
![](http://img1.ph.126.net/yf8cj0QW14e5gxM4fMpUOA==/6632465244978652324.png)
继续往下走 又走到了 foo1() 这次直接跳到了 deco 函数去执行它
所以其实执行 test1 函数 就是执行 deco 函数
在执行 deco 函数的时候 先取了一个 start_time
然后执行 func() 函数
![](http://img1.ph.126.net/URxuVANOEKzva0zAOKnbbg==/6632600484908869219.png)
执行 func() 函数 其实就是执行 foo1() 函数
这是因为 语法糖里面已经把 foo1 作为参数传给了 timer(func) 函数
执行 foo1() 函数 就是进入 foo1() 函数的函数体
先睡 1 秒 然后 print 一行话
之后 再取一个 stop_time 然后再 print 一行话 结束
转载于:https://www.cnblogs.com/lovelyming/p/7265661.html
python学习之路(九)相关推荐
- Python学习之路9☞面向对象的程序设计
Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...
- python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...
- Python学习之路—2018/7/14
Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...
- Python学习之路—2018/6/20
Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...
- python学习笔记(九)之语句1
python学习笔记(九)之语句1 print python2中,print是一个语句,python3中它是一个函数. 实例1: >> print "hello,world!&q ...
- python 学习之路开始了
python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html
- Python学习之路5☞文件处理
Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...
- python学习之路0x00
Python学习之路0x00 在学习python之前,要知道什么是python? python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,与c语言不同, c语言要编译后才能执行.而 ...
- 我的Python学习之路(一)_Mr_Ouyang
我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...
- 一木.溪桥---Python学习之路
一木.溪桥---Python学习之路 1.工作十年常常想起的一些人和一些事 2.选择学习Python的初衷 1.工作十年常常想起的一些人和一些事 我是一名成套电气工程师,专业是电气工程及其自动化(供配 ...
最新文章
- 结构成员访问的三种方法
- Linux与Windows文件共享命令 rz,sz
- 谷歌宣布对外开放聊天机器人数据分析平台Chatbase
- 【精解】Exchange Server 2007群集连续复制
- IOC--IOC+AOP--热插拔的系统架构实现演化
- Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
- android 辐射动画_Android 四种动画效果的调用实现代码
- HTML5期末大作业:体育主题网站设计——足球(9页) HTML+CSS+JavaScrip校园篮球网页作业成品 学校篮足球网页制作模板 学生简单体育运动网站设计成品
- 华为USG6000V双机热备HRRP
- SUSE Linux 网络配置
- 什么是请求报文和响应报文?
- 华为员工工资曝光:入职12年月薪31万,小编我瑟瑟发抖
- keil下汇编语言调试分析
- 关于对接海康威视综合安防平台并使用SDK下载过车视频
- dpdk-pktgen进行发包,dpdk-testpmd和dpdk-pdump进行收包并保存为pcap文件
- 服务器文件被篡改evopro后缀,SQLServer数据库服务器mdf文件中了勒索病毒,扩展名被篡改为.fuk25933...
- 苹果生产日期对照表2020_苹果又开发布会,确定于11月11日举办特别活动 | AirPods Pro 免费换新计划...
- 什么是IPQC(制程控制)?
- Vue2.0 新手完全填坑攻略——从环境搭建到发布
- 文献阅读-融合注意力机制的 IETM 细粒度跨模态检索算法