在学完每一个内容之后,老师都会给我们留一些习题,这篇内容是装饰器的习题:
案例一
题目
创建装饰器,要求如下:
1.创建add_log装饰器,被装饰的函数打印日志信息;
2.日志格式为:[字符串时间]函数名:xxx,运行时间:xxx,运行返回值结果:xxx
代码
自己写的代码:
import sys
import time
t1=time.clock()
def add_log(func):
def inner():
print('函数名:',func.__name__)
return func()#有返回值
return inner
@add_log
def data_print():
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
return '运行成功'
t2=time.clock
print(data_print())
print('运行时间:',t2-t1)
在网上找代码验证了一下:
import time
import functools
def add_log(fun):
#保留被装饰函数的函数名和帮助信息文档
@functiontools.wraps(fun)
def inter(*arg,**kwargs):
#time.time():秒数
start_time=time.time()
#由于被装饰函数有返回值
res=fun(*args,**kwargs)
end_time=time.time()
#运行返回值结果:即为函数的返回值,fun.__name__:返回函数名
print('[%s] 函数名:%s,运行时间:%.6f,运行返回值结果:%d',% (time.ctime()),fun.__name__,end_time-start_time,res)
#所以必须return返回函数返回值
return res
return inter
#添加装饰,自定义函数
@add_log
def add(x,y):
time.sleep(1)#让时间不至于太短
return x+y
print(add(1,10))
问题
1.理解错了意思,认为是要定义一个打印日志的函数,装饰器的目的是让打印出来的内容按照题中示意的格式。
2.不会用functools模块,还要深入理解一下。
3.运行结果的格式调整不太灵活。
Reference
https://blog.csdn.net/lilygg/article/details/86775226