看了很多关于装饰器的文章,发现还是要手动自己写写代码,总结总结才能加深印象。
1、装饰器用来扩展已有函数的功能,在不改变函数内部结构的情况,扩展函数的功能。
2、装饰器传入的是一个函数,返回的也是一个函数。
def demo1(func):
def spend():
start_time = time.time()
func()
end_time = time.time()
total_time = (end_time - start_time) * 1000
print("函数耗时%d ms" % total_time)
return spend # 注意pycharm自动补齐,会加上一个括号,这里不需要括号
@demo1
def test():
s = 0
for i in range(101):
s = s + i
time.sleep(0.1)
print(s)
if __name__ == '__main__':
test()
得到如下结果
3、多个装饰器
def demo2(func):
def sheet():
print("测试开始")
func()
print("测试结束")
return sheet
@demo1
@demo2
def test():
s = 0
for i in range(101):
s = s + i
time.sleep(0.1)
print(s)
先执行第二个装饰器,再执行第一个装饰器,最后执行函数本身,输出结果如下,
4、当函数中有不定长的参数时,使用收集参数
def demo3(func):
def tester(*args, **kwargs):
print("start test...")
func(*args, **kwargs)
print("end test...")
return tester
@demo3
def plus(a, b, c):
print(a+b+c)
if __name__ == '__main__':
plus(10, 12, 15)
输出结果如下,
5、当被装饰的函数中会return一个值时,必须在装饰器中,return被装饰函数的结果。否则执行函数返回的是None。
def demo3(func):
def tester(*args, **kwargs):
print("start test...")
ret = func(*args, **kwargs)
print("end test...")
return ret # 这里返回被装饰函数的return结果
return tester
@demo3
def plus(a, b, c):
return a+b+c
if __name__ == '__main__':
print(plus(10, 12, 15))
输出如下,