装饰器详解(python)
来源:互联网 发布:好的莆田鞋淘宝店 编辑:程序博客网 时间:2024/06/01 19:16
本文将介绍装饰器的内容,并举例说明。
装饰器在python中实际上就是一个函数,这个函数可以在不改变原(其他)函数代码和调用方式的条件下为原函数添加功能。装饰器(函数)在结尾返回一个函数对象。常常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。
编写装饰器函数的原则是:
1. 不能修改原函数(被装饰的函数)的源代码。
2. 不能修改原函数的调用方式。
下面我们从原函数开始,以逐渐满足两个原则的步骤得到装饰器代码。
首先定义原函数
__author__ = "Allen Liu"__time__ = "2017/8/1"'''This program is an example of decorator '''import timedef func1(): print('Start the function fun1...') time.sleep(1) print('The function fun1 is end!')那么我们想为函数添加一个计时的功能,想要达到的效果就是可以得到函数执行花费的时间,例如输出‘The time of fun1 cost is **’。
在不改变原函数代码的条件下,我们可以定义一个名为deco的函数统计原函数所需的运行时间:
def deco(fun): start_time = time.time() fun() end_time = time.time() run_time = end_time - start_time print('The running time is %f' % run_time)然后调用deco函数获得运行时间:
deco(func1)这种方法满足装饰器的第一个原则:不改变源代码。但是改变了原函数的调用方式,(原函数的调用方式为func1())。
下面我们通过函数嵌套的方式,对上面的deco函数做出修改,使其满足第二条原则:
def deco(fun): def wrapper(): start_time = time.time() fun() end_time = time.time() run_time = end_time - start_time print('The running time is %f' % run_time) return wrapperfunc1 = deco(func1)func1()这时候将函数func1传入deco函数,函数的输出为一个函数wrapper,将其复制给变量func1,在通过加小括号的方式运行该函数。就达到了不改变函数调用方式的原则。可见这样就满足了装饰器的两个原则,一个比较完整的装饰器(deco)就得到了。
下面介绍装饰器语法糖:
在Python中,可以使用”@”语法糖来精简装饰器的代码,此时只需要在func1函数定义前添加代码@deco
这句代码等价于:func1 = deco(func1)。然后就可以直接通过func1()进行调用。
阅读全文
1 0
- 装饰器详解(python)
- Python装饰器详解
- python装饰器详解
- Python装饰器详解
- Python 装饰器详解
- python装饰器详解
- python @装饰器 详解
- Python 装饰器详解
- python装饰器详解
- Python装饰器详解
- Python装饰器详解
- 详解Python装饰器
- python装饰器详解
- python 装饰器详解
- 详解python装饰器
- python入门(十二):装饰器详解
- Python中的装饰器详解
- 详解Python的装饰器
- SQL Server笔记(二)约束(Constraint)与触发器
- BFS_连连看问题
- 7月27日知识整理
- GreenDao3.0使用
- Nginx简单介绍及开启
- 装饰器详解(python)
- js顺序
- hdu2602 Bone Collector
- IO流将指定内容写入指定目录文件内
- ios 设置属性依赖
- 设计模式--iterator模式简要探究
- 数据结构实验之队列一:排队买饭
- jsp多选并且模糊查询下拉框
- 视觉设计是怎样影响用户体验的