Python3.5:装饰器的使用
在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数
>>> def funA():
... print('i an funA')
... time.sleep(1)
>>> f = now
>>> f()
i am funA
函数对象有一个__name__属性,可以拿到函数的名字:
>>> funA.__name__
'funA'
>>> f.__name__
'funA'
当我们想计算这个函数的运行时间,可以再创一个函数:
def print_time():
start = time.time()
funA()
end = time.time()
print('耗时%s秒' % (end - start)) >>>print_time()
i am funA
耗时1.0043737888336182秒
这时调用的并不是funA()而是print_time(),要是我们只能调用funA又要输出他的函数运行时间,这该怎么办?这时就可以派出今天的主人公,deractor(装饰器),简单来说在一个函数里面再嵌套一个函数,在这之前再看一个版本:
import time
# 随便定义一个函数
def funA():
print('i am funA')
time.sleep(1) def log(func):
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper if __name__ == '__main__':
n = log(funA)
n()
输出结果为:
i am funA
耗时1.0012261867523193秒
依旧可以,但好像有点麻烦,我们可以在def funA():上面加上@log,有个小细节,log(func)必须要在funA()之前,不然@log找不到,总的代码贴上:
import time
# 随便定义一个函数
def log(func):
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper
@log
def funA():
print('i am funA')
time.sleep(1) if __name__ == '__main__':
funA()
运行结果和上面一样,这样看起来就好多了,当然一个函数不单单可以嵌套一个函数,可以多个看你的需求,不同的嵌套发挥不同的作用。一开始说的,每个函数有个自带的.__name__属性,在主函数加个print(funA().__name__)会发现输出的是wrapper,这是因为log里面return的是wrapper,在某些情况下我们需要根据函数所属名来判断条件,那装饰器就成为累赘了,还好有个module(模块)叫functools,导入它并在def wrapper():前面加上@functools.wraps(func),意思就是将func包起来,不让他指向别的函数,这下运行结果就正常了:
import time
import functools
# 随便定义一个函数
def log(func):
# 函数可以接受任意参数的调用
@functools.wraps(func)
def wrapper():
start = time.time()
func()
end = time.time()
print('耗时%s秒' % (end - start))
return wrapper
@log
def funA():
print('i am funA')
time.sleep(1) if __name__ == '__main__':
funA()
print(funA.__name__)
运行结果:
i am funA
耗时1.0033290386199951秒
funA
Python3.5:装饰器的使用的更多相关文章
- (转)Python3.5——装饰器及应用详解
原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...
- python3.7 装饰器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- python3之装饰器
1.装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处 ...
- python3之装饰器修复技术@wraps
普通函数 def f(): """ 这是一个用来测试装饰器修复技术的函数 """ print("哈哈哈") if __n ...
- Python3中装饰器的使用
较为复杂的装饰器使用: user,passwd = 'hjc',111111 def auth(type): print('auth type:',type) def outwrapper(func) ...
- python3 使用装饰器,及函数作为参数
#装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...
- 【python3】装饰器
参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...
- python3中装饰器的用法总结
装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...
随机推荐
- javac 实现原理
javac 概述 javac 是jdk bin目录下的一个脚本. 用于编译 java程序的源代码,但是 其实现的本质 是基于 jdk 标准类库中的 javac类库实现,所以java的编译器实质上是一个 ...
- 高频dom操作和页面性能优化(转载)
作者:gxt19940130 原文:https://feclub.cn/post/content/dom 一.DOM操作影响页面性能的核心问题 通过js操作DOM的代价很高,影响页面性能的主要问题有如 ...
- C语言之逆序数
#include<stdio.h>int main(){int num;int a,b,c,result,d,result1;scanf("%d",&num); ...
- 网页的居中显示,使用了margin、clear:both
很久没写过页面了,现在写起来也觉得捡起来还是挺快的. 当时遇到了这样的问题,我有一个大的div包涵了整个网站,有网页头部,中部还有底部.头部就是一个标题,中部就是几张图片跟文字排版,结果左右两边的图片 ...
- 常用IO按位操作
PORTD |= (1 << op) //位置高PORTD &= ~(1 << op) //位置低PORTD ^= (1 < ...
- 用shape画内圆外方,形成一个圆形头像
很多人都有过这样的经历,想要在自己写的程序里,上传一张随便大小形状的照片在程序里显示都是圆形照片,或者是方形,或者是三角形,但是写代码又非常麻烦,这里就有一个也可以实现一样效果的方法,那就是用 lay ...
- QT之TCP通信
QT中可以通过TCP协议让服务器和客户端之间行通信.所以下面我就围绕服务器和客户端来写. 这是我么写服务器和客户端的具体流程: A.服务器: 1.创建QTcpServer对象 2.启动 ...
- JS 判断某个字符串是否存在与数组中
<script> function in_array(stringToSearch, arrayToSearch) { for (s = 0; s < arrayToSearch.l ...
- Yahoo网站性能优化的34条军规
1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容,这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数,这是提高网页速 ...
- Music Tags 隐私政策
隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...