17_Python装饰器
一、什么是装饰器
目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来
import time
def func():
print('嘻嘻哈哈') start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
如果,我们给fun1,fun2,fun3,实现相同的功能呢?
def func():
print('嘻嘻哈哈') def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time)) f = func
func = timmer
func(f)
但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。
怎么解决这种问题呢,装饰器。
装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。
def func():
print('嘻嘻哈哈') def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
return timmer f = timmer(func)
f()
@语法糖 : 在定义函数的时候使用,避免再一次赋值操作。
代码修改如下:
def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
return timmer @timmer
def func():
print('嘻嘻哈哈')
二、带参数的装饰器
import time def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner @wrapper
def fun(a):
print("%s嘻嘻哈哈" %(a)) @wrapper
def fun1(a,b):
print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))
三、带返回值的装饰器
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
ret = f(*args,**kwargs)
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return ret
return inner @wrapper
def fun(a):
s = "%s嘻嘻哈哈" %(a)
return s print(name)
总结:就是 我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。
17_Python装饰器的更多相关文章
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- python基础补漏-05-生成器和装饰器
[1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...
- python --> 递归 以及装饰器
一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...
- python 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
随机推荐
- ECJTUACM16 Winter vacation training #1 题解&源码
//寒假训练赛,第一次拿第一,感觉很爽哦,AC3题! A------------------------------------------------------------------------ ...
- hihoCoder #1043 : 完全背包(板子题)
#1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...
- 二叉排序树BST+求树深度算法
#include "stdio.h" #include "malloc.h" typedef struct node { int key; struct nod ...
- hdu_3068 最长回文(Manacher算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others) M ...
- HDU1016(素数环)
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Visual Studio 2017 安装后无法创建c++或MFC项目
话话不多说,直接上图
- c语言字符相关函数
1.fgetc(getc)fputc(putc)区别: getc和putc都是针对标准输入输出的,而fgetc和fputc可以对任意的文件操作,也可以用fgetc和fputc对标准输入输出操作fget ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- [国嵌攻略][070][GDB调试程序]
GDB是GNU发布的一款功能强大的调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试的程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检测程序状态. GDB使用流程 1 ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...