博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用装饰器时带括号与不带括号的区别
阅读量:6163 次
发布时间:2019-06-21

本文共 2055 字,大约阅读时间需要 6 分钟。

hot3.png

之前我们在中写了一个装饰器,用于统计函数调用时间。代码如下:

from time import timefrom time import sleepdef count_time():    def tmp(func):        def wrapped(*args, **kargs):            begin_time = time()            result = func(*args, **kargs)            end_time = time()            cost_time = end_time - begin_time            print '%s called cost time : %s' %(func.__name__, cost_time)            return result        return wrapped    return tmp

对于该装饰器,我们必须这样使用:

@count_time()def test():    sleep(0.5)if __name__ == '__main__':    test()

这里注意,装饰器后面加了括号。

如果我们不加括号:

@count_timedef test():    sleep(0.5)if __name__ == '__main__':    test()

就会产生错误:

Traceback (most recent call last):  File "16.py", line 16, in 
@count_timeTypeError: count_time() takes no arguments (1 given)

 

但是很多装饰器使用时,是不必加括号的,那么这是怎么回事?

 

我们将上面的装饰器进行改写:

from time import timefrom time import sleepimport sysdef count_time(func):    def wrapped(*args, **kargs):        begin_time = time()        result = func(*args, **kargs)        end_time = time()        cost_time = end_time - begin_time        print '%s called cost time : %s ms' %(func.__name__, float(cost_time)*1000)        return result    return wrapped

此时,就不需要加括号了。

这二者的区别在于,第一个存在括号,允许用户传入自定义信息,所以需要额外包装一层,不加括号的版本则不需要。

 

所以当我们需要自定义装饰器内的某些message时,就需要采用加括号的方式。

对于这个统计时间的装饰器,我们可以这样自定义信息:

#coding: utf-8from time import timefrom time import sleepdef count_time(msg):    def tmp(func):        def wrapped(*args, **kargs):            begin_time = time()            result = func(*args, **kargs)            end_time = time()            cost_time = end_time - begin_time            print 'msg: %s ,%s called cost time : %s' %(msg, func.__name__, cost_time)            return result        return wrapped    return tmp

然后这样使用:

@count_time("foobar")def test():    sleep(0.5)@count_time("测试消息")def test2():    sleep(0.7)if __name__ == '__main__':    test()    test2()

结果如下:

msg: foobar ,test called cost time : 0.501540899277msg: 测试消息 ,test2 called cost time : 0.701622009277

 

后面综合前面几篇,写一个完整的装饰器教程。

转载于:https://my.oschina.net/inevermore/blog/388639

你可能感兴趣的文章
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>
Android开发之自定义对话框
查看>>
微信Access Token 缓存方法
查看>>
Eclipsed的SVN插件不能识别之前工作空间的项目
查看>>