python装饰器

最近在看廖雪峰老师的python教程:廖雪峰的官方网站-python

在装饰器这块纠结了挺长时间,下面是课后题:

import functools
import time
def log(text):
	def metric(fn):
	    @functools.wraps(fn)
	    def wrapper(*args,**kw):
	        begin=time.time()
	        fv=fn(*args,**kw)
	        end=time.time()
	        print('%s %s() executed in %s ms' % (text,fn.__name__,end-begin))
	        return fv
	    return wrapper
	return metric
测试1:打印name

def fast(x, y):
	time.sleep(0.12)
	return x+y
func = log('myfunction')(fast)
print('funcName is '+func.__name__)

funcName is fast
[Finished in 0.3s]
如果把@functools.wraps(fn)去掉,那么打印出来的funcName便是metric,因为log函数返回metric, @functools.wraps(fn)相当于 wrapper.__name__ = fn.__name__

测试2:

def fast(x, y):
	time.sleep(0.12)
	return x+y
result = log('myfunction')(fast)(1,2)
print(result)
myfunction fast() executed in 0.12011098861694336 ms
3
[Finished in 0.3s]

原式 log('myfunction')(fast)(1,2) 分开解析:

第一步 log('myfunction') ,返回metric,那么原式变为 metric(fast)(1,2) 

第二步 metric(fast),返回 wrapper,原式变为 wrapper(1,2) 

第三部执行wrapper函数,fv=fast(1,2) ,打印时间返回3

测试3: 另一种方式

@log('myfunction')
def fast(x, y):
	time.sleep(0.12)
	return x+y
f = fast(1,2)
print(f)
myfunction fast() executed in 0.12011098861694336 ms
3
[Finished in 0.3s]









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值