2019年2月24日 装饰器基本实现
#装饰器框架 import time def timer(func): def wrapper(): #print(func) start_time=time.time() func()#就是在运行test() stop_time=time.time() print("stop-start=%s"%(stop_time-start_time)) return wrapper# 这个return 是针对timer函数的 def test(): time.sleep(2) print('test函数运行完毕') test=timer(test)#返回的是wrapper的地址,然后重新对test进行赋值操作 test()#执行的是wrapper() #@timer 语法堂?就相对于做了test=timer(test) 这个操作 #需要传装饰哪个函数,就在哪个函数上面填写@timer
》》》》》》》》》》》》》》》》》》》》》》》》
标准写法:(不带返回值)
#装饰器框架 import time def timer(func): def wrapper(): #print(func) start_time=time.time() func()#就是在运行test() stop_time=time.time() print("stop-start=%s"%(stop_time-start_time)) return wrapper# 这个return 是针对timer函数的 @timer def test(): time.sleep(2) print('test函数运行完毕') def test2(): time.sleep(3) print("test2函数运行完毕") @timer def test3(): time.sleep(1) print("test3函数运行完毕") test() test2() test3()
>>>
test函数运行完毕
stop-start=2.0032529830932617
test2函数运行完毕
test3函数运行完毕
stop-start=1.0023720264434814
最终版 带返回值
#装饰器框架 import time def timer(func): def wrapper(): #print(func) start_time=time.time() res=func()#就是在运行test()并获得一个返回值 stop_time=time.time() print("stop-start=%s"%(stop_time-start_time)) return res return wrapper# 这个return 是针对timer函数的 @timer def test(): time.sleep(2) print('test函数运行完毕') return "这是test的返回值" res2=test() print(res2)#此处 运行test实际运行的是timer里的wrapper,所以没有原来test的返回值
》》》》
test函数运行完毕
stop-start=2.0010669231414795
这是test的返回值
超级终极版-传递不确定数量的参数
import time def timer(func): def wrapper(*args,**kwargs):#必须使用*,和**,因为参数数量不确定 start_time=time.time() res=func(*args,**kwargs)#就是在运行test()并获得一个返回值 stop_time=time.time() print("stop-start=%s"%(stop_time-start_time)) return res return wrapper# 这个return 是针对timer函数的 @timer def test(name,age): time.sleep(2) print('test函数运行完毕,名字是%s,年纪是%s'%(name,age)) return "这是test的返回值" @timer def test1(name,age,gender): time.sleep(1) print('名字是%s,年纪是%s,性别是%s'%(name,age,gender)) return "这是test1的返回值" res2=test('sxj',22) print(res2)#此处 运行test实际运行的是timer里的wrapper,所以没有原来test的返回值 res3=test1('abc',33,'man') print(res3)