python进阶(小白也能看懂)——装饰器浅谈(一)
python进阶(小白也能看懂)——装饰器(一)
第四篇
文章目录
- python进阶(小白也能看懂)——装饰器(一)
- 1.函数基础知识
- 例子1.1
- 例子1.2
- 例子1.3
- 例子1.4
- 2.不带参数的装饰器
- 3.带参数的装饰器
- 参考
1.函数基础知识
谈装饰器前,先了解一下函数的基础知识
- python中一切都是对象,函数也是对象,可以将一个函数赋值给另一个变量
- 函数可以嵌套,即在一个函数内部定义另一个函数
- 函数中可以将另一个函数作为返回值返回
- 函数可以作为参数传给另一个函数
例子1.1
## 定义加法函数
def add_a_b(a, b):print(a+b)
## 将该加法函数赋给t,这样t也就是一个函数了,拥有加法功能
t = add_a_b
t(1,2)"""
3
"""
例子1.2
# 在函数内部定义函数
def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 调用inner函数,且只能在ouer函数里面调用innerinner()outer()
"""
I'm in outer
I'm in inner of outer
"""
inner()
"""
NameError: name 'inner' is not defined
"""
例子1.3
# 函数中将另一个函数作为返回值返回
def outer():print("I'm in outer")def inner():print("I'm in inner of outer")## 调用inner函数,且只能在ouer函数里面调用innerreturn inner# 这里p相当于inner
p = outer()
p()"""
I'm in outer
I'm in inner of outer
"""
例子1.4
import timedef runningtime(func):def wrapper(*args, **kwargs):## 添加计时功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("运行完{}花费了{}秒".format(func.__name__, interval))return wrapperdef add_a_b(a, b):print(a+b)## equipped_func接收从runningtime返回的函数
equipped_func = runningtime(add_a_b)
equipped_func(1000,54489)"""
55489
运行完add_a_b花费了0.0009965896606445312秒
"""
2.不带参数的装饰器
所谓装饰器是作用在函数身上的,主要是丰富函数的功能,并且非常方便。
假设我们写了10000个函数,我们想测试运行每个函数所需要的时间,那么可以用装饰器添加计算时间的功能:
import time
from functools import wraps## 定义装饰器
def runningtime(func):@wraps(func)def wrapper(*args, **kwargs):## 添加计时功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("运行完{}花费了{}秒".format(func.__name__, interval))return wrapper@runningtime
def add_a_b(a, b):print(a+b)add_a_b(1000,54489)"""
55489
运行完add_a_b花费了0.00099945068359375秒
"""
与例子1.4对比不难发现在函数前面加上@runningtime
的作用就相当于function = runningtime(function)
。
3.带参数的装饰器
from functools import wraps
import time## 带参数的装饰器
def logging(logfile):def runningtime(func):@wraps(func)def wrapper(*args, **kwargs):## 添加计时功能start = time.time()func(*args, **kwargs)interval = time.time() - startprint("运行完{}花费了{}秒".format(func.__name__, interval))## 将日志写入日志文件中with open(logfile,'a') as f:f.write(str(interval)+'\n')return wrapperreturn runningtime@logging('test.txt')
def add_a_b(a, b):print(a+b)add_a_b(1000,54489)"""
55489
运行完add_a_b花费了0.0030028820037841797秒
"""
在这里,带参数的装饰器起的作用相当于function = logging('test.txt')(function)
参考
定义一个带参数的装饰器
python进阶(小白也能看懂)——装饰器浅谈(一)相关推荐
- python进阶(小白也能看懂)——Map、Filter、Reduce
python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...
- python进阶(小白也能看懂)——*args与**kwargs的使用
python进阶(小白也能看懂)--*args与**kwargs的使用 第一篇 理解*args与**kwargs在定义函数时的作用 假设你写了一个函数multiply(函数定义在下面),专门用来处理两 ...
- 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)
小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...
- 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)
小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...
- armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...
小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...
- 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...
一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...
- c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...
原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...
- 小白也能看懂的网络基础 | 01 什么是网络?
公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...
- 小白也能看懂的网络基础 | 02 什么是连接设备?
公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...
最新文章
- 在apache中使用 memcache 来作 session 存储
- Android性能优化典范第四季
- Vue.js 自定义事件
- HDU2035人见人爱A^B(快速幂求余)
- 【干货】运维需要掌握的 17 个实用技巧
- 取后端数据_用 Flask+Axios 实现前后端数据通信:查询动森鱼类价格
- (转)AS3 Socket
- 把ASP应用中的Session传递给asp.net应用
- glassfish发布应用_WildFly 8与GlassFish 4 –选择哪个应用服务器
- 四则运算题目生成程序(基于控制台)
- 硅谷的高科技公司与“抵消战略”
- [Swift]LeetCode599. 两个列表的最小索引总和 | Minimum Index Sum of Two Lists
- VTK模块学习(一)
- 《Java从小白到大牛精简版》之第6章 运算符(上)
- linux 备份到云存储空间,Ubuntu 使用教程- 自动备份Ubuntu 14.04到Box云存储上
- 聊天类APP的测试点
- 服务器vmx 文件,ISO,虚拟机,VMware,VMX文件和VMDK文件之间的关系
- 百度地图API的使用
- 华为机试HJ102:字符统计
- Go:内核线程、LWP、用户线程? 还是协程?