python进阶(小白也能看懂)——装饰器(一)

第四篇

文章目录

  • python进阶(小白也能看懂)——装饰器(一)
    • 1.函数基础知识
      • 例子1.1
      • 例子1.2
      • 例子1.3
      • 例子1.4
    • 2.不带参数的装饰器
    • 3.带参数的装饰器
    • 参考

1.函数基础知识

谈装饰器前,先了解一下函数的基础知识

  1. python中一切都是对象,函数也是对象,可以将一个函数赋值给另一个变量
  2. 函数可以嵌套,即在一个函数内部定义另一个函数
  3. 函数中可以将另一个函数作为返回值返回
  4. 函数可以作为参数传给另一个函数

例子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进阶(小白也能看懂)——装饰器浅谈(一)相关推荐

  1. python进阶(小白也能看懂)——Map、Filter、Reduce

    python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...

  2. python进阶(小白也能看懂)——*args与**kwargs的使用

    python进阶(小白也能看懂)--*args与**kwargs的使用 第一篇 理解*args与**kwargs在定义函数时的作用 假设你写了一个函数multiply(函数定义在下面),专门用来处理两 ...

  3. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  4. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

  5. armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...

    小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...

  6. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  7. c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...

    原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...

  8. 小白也能看懂的网络基础 | 01 什么是网络?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

  9. 小白也能看懂的网络基础 | 02 什么是连接设备?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

最新文章

  1. 在apache中使用 memcache 来作 session 存储
  2. Android性能优化典范第四季
  3. Vue.js 自定义事件
  4. HDU2035人见人爱A^B(快速幂求余)
  5. 【干货】运维需要掌握的 17 个实用技巧
  6. 取后端数据_用 Flask+Axios 实现前后端数据通信:查询动森鱼类价格
  7. (转)AS3 Socket
  8. 把ASP应用中的Session传递给asp.net应用
  9. glassfish发布应用_WildFly 8与GlassFish 4 –选择哪个应用服务器
  10. 四则运算题目生成程序(基于控制台)
  11. 硅谷的高科技公司与“抵消战略”
  12. [Swift]LeetCode599. 两个列表的最小索引总和 | Minimum Index Sum of Two Lists
  13. VTK模块学习(一)
  14. 《Java从小白到大牛精简版》之第6章 运算符(上)
  15. linux 备份到云存储空间,Ubuntu 使用教程- 自动备份Ubuntu 14.04到Box云存储上
  16. 聊天类APP的测试点
  17. 服务器vmx 文件,ISO,虚拟机,VMware,VMX文件和VMDK文件之间的关系
  18. 百度地图API的使用
  19. 华为机试HJ102:字符统计
  20. Go:内核线程、LWP、用户线程? 还是协程?

热门文章

  1. 小强升职记梗概_解读《小强升职记》——一本关于时间管理的书
  2. 【学习笔记】人类为什么最终选择了芯片
  3. Modify批量处理优化
  4. 涨姿势时间:为什么飞机的往返时间会不一样?
  5. 销售订单屏幕增强及功能增强
  6. ERP项目成败的三个因素
  7. 虚拟和现实,两种不同身份的切换——留美95后的游戏人生
  8. set python_python基础:集合-set()
  9. mate 10android o主题,Mate10不仅硬件强,还有安卓8.0
  10. 卡方分布的期望和方差_T检验、F检验、卡方检验详细分析及应用场景总结