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

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

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

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://www.cnblogs.com/inevermore/p/4219882.html

你可能感兴趣的文章
BZOJ4133 : Answer的排队
查看>>
基于Centos搭建 Mono 开发环境
查看>>
算法题:福尔摩斯的约会
查看>>
Oralce sql (+) 补充
查看>>
hdu 2665 划分树
查看>>
laravel中的plicy授权方法:
查看>>
基于R进行相关性分析--转载
查看>>
常用 cdn
查看>>
tomcat8 管理页面403 Access Denied的解决方法
查看>>
怎样避免应用冷启动
查看>>
把vux中的@font-face为base64格式的字体信息解码成可用的字体文件
查看>>
vue sync
查看>>
CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
查看>>
Wix 安装部署教程(十一) ---QuickWix
查看>>
Spring @Value注解问题
查看>>
P1886 滑动窗口
查看>>
实施vertex compression所遇到的各种问题和解决办法
查看>>
ubuntu 12.04 rails server 时候报错 execjs
查看>>
linux下文件压缩与解压操作
查看>>
使用树莓派实现微信远程监控
查看>>