python装饰器的认识
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
传参和返回值都是函数
用的语法糖形式,比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。
写法: 1. 要额外增加的功能函数单独写; 2. 在调用装饰器的地方使用@***的写法,此时会把这个函数或方法传入到装饰器中进行使用;
3. 当有多个装饰器时,从内向外开始执行; 4. 装饰器需要传参时,需要再多嵌套一层
# 为函数添加一个统计运行时长的功能 import time import threading def how_much_time(func): def inner(): t_start = time.time() func() t_end = time.time() print("一共花费了{0}秒时间".format(t_end - t_start, )) return inner @how_much_time # @how_much_time等价于sleep_5s = how_much_time(sleep_5s) def sleep_5s(): time.sleep(5) print("%d秒结束了" % (5,)) @how_much_time def sleep_6s(): time.sleep(6) print("%d秒结束了" % (6,)) t1 = threading.Thread(target=sleep_5s) t2 = threading.Thread(target=sleep_6s) t1.start() t2.start()
@wrap()语法糖:因为装饰器实质是就是一个函数,是一个被修饰过函数,他与原来未被修饰的函数是两个不同的函数对象。
所以,这个装饰器丢失了原来函数对象的一些属性,比如:__name__,__doc__等属性。使用wraps语法糖可以保留这些属性。