Python之装饰器
# 装饰器功能说明 """ python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。 比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。 装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能,性质。 """ import time def how_much_time(func): print("how_much_time函数开始运行") def inner(): t_start = time.time() func() t_end = time.time() print(f"一共花费了{t_end - t_start:.6f}秒时间") return inner # @how_much_time等价于sleep_1s = how_much_time(sleep_1s) @how_much_time def sleep_1s(): """ how_much_time函数开始运行 1秒结束了 一共花费了1.007465秒时间 """ time.sleep(1) print("%d秒结束了" % (1,)) sleep_1s() # 执行 def mylog(func): print("mylog函数开始运行") def inner_2(): print("start") func() print("end") return inner_2 # 多个装饰器demo1,等价于mylog(how_much_time(sleep_more)) @mylog @how_much_time def sleep_more(): """ how_much_time函数开始运行 mylog函数开始运行 start 2秒结束了 一共花费了2.003144秒时间 end """ time.sleep(2) print("%d秒结束了" % (2,)) sleep_more() def add(func): def inner(): x = func() x = x + 1 print("add方法执行,x:", x) return x return inner def cube(func): def inner(): x = func() x = x * x * x print("cube方法执行,x:", x) return x return inner def square(func): def inner(): x = func() x = x * x print("square方法执行,x:", x) return x return inner # 多装饰器demo2,先square,再cube,最后add @add @cube @square def test(): """ square方法执行,x: 4 cube方法执行,x: 64 add方法执行,x: 65 65 """ return 2 print(test()) # 带参数的装饰器 print("", sep="\n") print("#" * 5, "带参数的装饰器", "#" * 5, sep=" ") def logger(msg): def time_master(func): def inner(): start = time.time() func() end = time.time() print(f"{msg}函数执行耗时{end - start:.4f}") return inner return time_master @logger(msg="my_fun") def my_fun(): """ my_fun正在执行 my_fun函数执行耗时1.0109 """ print("my_fun正在执行") time.sleep(1) my_fun() # 等于没有装饰器时的调用 logger(msg="my_fun")(my_fun)()