python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
1、装饰器结构
def w1(func): def inner(): # 验证1 # 验证2 # 验证3 return func() return inner @w1 def f1(): print 'f1'
2、函数装饰器
1)函数不带参数
#函数装饰器-函数不带参数 import time def runtime(func): def wrapper(): start = time.time() f = func() # 原函数 end = time.time() print("运行时长:%.4f 秒" % (end-start)) return f return wrapper @runtime def func_a(): print("func_a") time.sleep(0.5) @runtime def func_b(): print("func_b") time.sleep(0.8) if __name__ == '__main__': func_a() func_b()
2)函数带参数
#函数装饰器-函数带参数 import time def runtime(func): def wrapper(*args,**kwargs): start = time.time() f = func(*args,**kwargs) # 原函数 end = time.time() print("运行时长:%.4f 秒" % (end-start)) return f return wrapper @runtime def func_a(a): print("func_a") print("a="+a) time.sleep(0.5) @runtime def func_b(b,c="3"): print("func_b") print("b="+b) print("c="+c) time.sleep(0.8) if __name__ == '__main__': func_a("1") func_b("2")
3)装饰器带参数
#函数装饰器-装饰器带参数 import time def runtime(slowly=1): def wrapper(func): def inner_wrapper(*args, **kwargs): start = time.time() f = func(*args, **kwargs) # 原函数 end = time.time() t = end-start print("运行时长:%.4f秒"%t) time.sleep(slowly) # 延迟效果 new_end = time.time() print("延时时长:%.4f 秒" % (new_end-start)) return f return inner_wrapper return wrapper @runtime(1.5) def func_a(a): print("a="+a) time.sleep(0.5) @runtime(0.5) def func_b(b, c="c"): print("b="+b) print("c="+c) time.sleep(0.8) if __name__ == '__main__': func_a("a") func_b("b", c="c")
3、类装饰器
1)装饰器不带参数
#类装饰器-装饰器带参数 import time class runtime: def __call__(self, func): def inner_wrapper(*args, **kwargs): start = time.time() f = func(*args, **kwargs) # 原函数 end = time.time() t = end-start print("运行时长:%.4f秒"%t) return f return inner_wrapper @runtime() def func_a(a): print("a="+a) time.sleep(0.5) @runtime() def func_b(b, c="c"): print("b="+b) print("c="+c) time.sleep(0.8) if __name__ == '__main__': func_a("a") func_b("b", c="c")
2)装饰器带参数
#类装饰器-装饰器带参数 import time class runtime: def __init__(self,slowly=1): self.slowly=slowly def __call__(self, func): def inner_wrapper(*args, **kwargs): start = time.time() f = func(*args, **kwargs) # 原函数 end = time.time() t = end-start print("运行时长:%.4f秒"%t) time.sleep(self.slowly) # 延迟效果 new_end = time.time() print("延时时长:%.4f 秒" % (new_end-start)) return f return inner_wrapper @runtime(1.5) def func_a(a): print("a="+a) time.sleep(0.5) @runtime(0.5) def func_b(b, c="c"): print("b="+b) print("c="+c) time.sleep(0.8) if __name__ == '__main__': func_a("a") func_b("b", c="c")
文章内容转载自上海-悠悠:https://www.cnblogs.com/yoyoketang/p/10801242.html