自学Python4.2-装饰器
自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django
自学Python4.2 - 装饰器
time.time() # 获取当前时间
time.sleep(10) #让程序在执行到这个位置的时候停10s
1.简单列子: 计算一段代码的执行时间
代码1:
import time
print(time.time())
def func(): # 被装饰的函数
start = time.time() # 获取开始的时间
print('我好喜欢大家啊 ~~') # 测试时间的代码
end = time.time()
print(end-start)
func()

代码2:
由于执行代码的速度太快,没有体现出来结果,这是可以使用 time.sleep(10) 加大代码执行的时间。
import time
print(time.time())
def func(): # 被装饰的函数
start = time.time() # 获取开始的时间
print('我好喜欢大家啊 ~~') # 测试时间的代码
time.sleep(0.01)
end = time.time()
print(end-start)
func()

代码3:
为了让函数func()完全分离出来,现在定义一个新函数timmer(),主要用于计算函数的执行时间(开始的时间,结束时间,执行的函数)
import time
print(time.time())
def func(): # 被装饰的函数
time.sleep(0.01)
print('我好喜欢大家啊 ~~') # 测试时间的代码
def timmer(func): #装饰函数
start = time.time() # 获取开始的时间
func()
end = time.time()
print(end-start) timmer(func) #执行timmer,而且是执行参数func的函数

代码4: 装饰器
其实上面的例子,真正环境下是存在问题的。 应该最终调用func(), 最好调用func()时候实质是调用timmer()
- 装饰器的作用:不想修改函数的调用方式,但是还想再原来的函数前后添加功能
- 装饰器的开发原则:开放封闭原则
- 装饰器的本质:闭包函数
- 以上例子timmer就是一个装饰器函数,只是对一个函数有一些装饰作用
函数的闭包定义:
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。

装饰器本质上就是一个python闭包函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。
import time
print(time.time())
def func():
time.sleep(0.01)
print('我好喜欢大家啊 ~~') def timmer(f): #装饰器函数
def inner():
start = time.time()
f() #被装饰的函数
end = time.time()
print(end - start)
return inner
func = timmer(func)
func() # 其实执行的是inner()


2.编码原则: 开放封闭原则
- 开放:对扩展是开放的
- 封闭:对修改是封闭的(封板)
3.装饰器---语法糖
import time
print(time.time()) def timmer(f): #装饰器函数
def inner():
start = time.time()
f()
end = time.time()
print(end - start)
return inner
@timmer #语法糖 @装饰器的函数 ,相当于func = timmer(func)
def func(): #被装饰的函数
time.sleep(0.01)
print('我好喜欢大家啊 ~~') func()

自学Python4.2-装饰器的更多相关文章
- 自学Python4.4-装饰器的进阶
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.5-装饰器举例
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.3-装饰器固定格式
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 自学Python4.6-迭代器
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- python--4、装饰器
装饰器(Decorator) 使用场景:为被装饰器装饰的函数增加功能,但又不希望修改函数的定义,即在代码运行期间动态增加功能. 装饰器更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也 ...
- [Python自学] day-21 (2) (Cookie、FBV|CBV装饰器)
一.什么是Cookie 1.什么是Cookie? Cookie是保存在客户端浏览器中的文件,其中记录了服务器让浏览器记录的一些键值对(类似字典). 当Cookie中存在数据时,浏览器在访问网站时会读取 ...
- TS 自学笔记(二)装饰器
TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...
- python自学第9天,装饰器
装饰器:本质是函数(装饰其它函数) 就是为其它函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数即变量 2.高阶函数:a.把一个 ...
- NO.4:自学python之路------内置方法、装饰器、迭代器
引言 是时候开始新的Python学习了,最近要考英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用 ...
随机推荐
- javascript与php与python的函数写法区别与联系
1.javascript函数写法种类: (一).第一种 function test(param){ return 111; } (二).第二种 var test = function(param){ ...
- 解决object at 0x01DB75F0
python在学习过程中吗,由于常常会出现代码运行没报错,但输出的却不是我们想要的结果(图表,列表等等),而出现类似 <filter object at 0x01DB75F0>的情况,比如 ...
- 关于XLL加载项动态加载、卸载的演示及XLL函数自定义类型注册的演示
1.在XLL中,把函数定义成不同的类型,在Excel中的实际效果也不同,具体如下: pxMacroType value ...
- gnuplot画折线图
之前尝试用jfreechart画自定义横坐标的折线图或时序图,发现很复杂,后来改用gnuplot了. gnuplot在网上一搜就能找到下载地址. 安装完成后,主要是命令行形式的交互界面,至少比jfre ...
- VO和DO转换(三) Dozer
VO和DO转换(一) 工具汇总 VO和DO转换(二) BeanUtils VO和DO转换(三) Dozer VO和DO转换(四) MapStruct 可参考的资料: dozer官网 Dozer(Jav ...
- laravel服务容器
laravel框架底层解析 本文参考陈昊<Laravel框架关键技术解析>,搭建一个属于自己的简化版服务容器.其中涉及到反射.自动加载,还是需要去了解一下. laravel服务容器 建立项 ...
- Errors running builder 'DeploymentBuilder' on project
Errors running builder 'DeploymentBuilder' on project 1.修改java源代码后点击保存,IDE 自动编译并热部署,提示如下错误: Errors o ...
- vue页面是否缓存的两种方式
第一种 <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> ...
- .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
- js尾递归函数
普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...