day3之装饰器
1、什么是装饰器?
#在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证
2、装饰器的形成过程
# 需求写一个函数测试另一个函数的执行效率
最初的实现方式,但是改变了函数的调用方式,需要改进
def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time) timer(func1)
改进后调用方式基本相似,但是多加了两行代码 def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time) f = func1
func1 = timer
func1(f) #== timer(func1)
最优的方法
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner
func1 = timer(func1) #做下关系转换
func1()
通过python提供的语法塘实现装饰器
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner @timer == func1 = timer(func1)
def func1():
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer == func2 = timer(func2)
def func2():
print("晚上回去和啤酒")
time.sleep(0.3)
func1()
func2()
# 装饰器传参
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return inner @timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer #== func2 = timer(func2)
def func2(a, b):
print("晚上回去和啤酒")
time.sleep(0.3) func1(111,222) #参数首先传到inner()函数 *args,然后在传到f1()函数中
func2(222,333)
# 函数返回值
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
ret = f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return ret
return inner @timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
return 666
ret = func1(1, 2)
print(ret)
装饰器的写法规范
def wrapper(f1):
def inner(*args, **kwargs):
执行函数之前的操作
ret = f1() #返回值
执行函数之后的操作
return ret
return inner
day3之装饰器的更多相关文章
- 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 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
随机推荐
- python的线上环境配置
1.安装python 2.7 http://www.cnblogs.com/strikebone/p/3970512.html 2.安装相关前置工具 pip, Django http://www ...
- cmake编译参数
进入源码目录后 cmake . -LH --查看之前编译参数 ccmake . 使用cmake gui界面进行查看和编辑编译用到的参数 (推荐) 源码目录下 INSTALL-SOURCE 文件后面 ...
- subnet partition
例1:本例通过子网数来划分子网,未考虑主机数. 一家集团公司有12家子公司,每家子公司又有4个部门.上级给出一个172.16.0.0/16的网段,让给每家子公司以及子公司的部门分配网段. 思路:既然有 ...
- 【346】TF-IDF
Ref: 文本挖掘预处理之向量化与Hash Trick Ref: 文本挖掘预处理之TF-IDF Ref: sklearn.feature_extraction.text.CountVectorizer ...
- HttpSession的关键属性和方法
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号:2.这个用户随后的所有请求都应包括这个标识号.服务器会校对这个标识号以判断请求属于哪个se ...
- tbytes 转 十六进制 string
function Bytes2HexStr(buf: TBytes; len: Integer): AnsiString; begin SetLength(Result, len*2); BinT ...
- python中库学习
一.numpy NumPy的主要对象是同种元素的多维数组.这是一个所有的元素都是一种类型.通过一个正整数元组索引的元素表格(通常是元素是数字).在NumPy中维度(dimensions)叫做轴(axe ...
- oracle与DB2
1.体系结构,DB2的实例和数据库分开的做法,我个人还是比较喜欢的,因为实例可以创建多个,数据库的恢复直接恢复到实例下就可以了,相对ORACLE简单多了. 2.管理工具,DB2的管理工具做得太简陋了, ...
- LINUX 修复relocation error: /lib/tls/libc.so.6
错误信息: relocation error: /lib/tls/libc.so.6: symbol _dl_tls_get_addr_soft, version GLIBC_PRIVATE not ...
- java写简单Excel 首行是目录 然后前台下载
页面: <form action="${path}/xxx/xxx.do" method="get" > 表格下载:<input type=& ...