Python之装饰器
一、装饰器
1.1 简单的装饰器
1 import time 2 def func(): 3 print('嘻嘻更健康') 4 def timmer(f): 5 def inner(): 6 start_time = time.time() 7 time.sleep(0.1) 8 f() 9 end_time = time.time() 10 print('----> 执行效率%s' % (end_time - start_time)) 11 return inner 12 func = timmer(func) # inner 13 func() # inner()
1.2语法糖
1 import time 2 def timmer(f): 3 def inner(): 4 start_time = time.time() 5 time.sleep(0.1) 6 f() 7 end_time = time.time() 8 print('----> 执行效率%s' % (end_time - start_time)) 9 return inner 10 @timmer # func = timmer(func) 11 def func(): 12 print('嘻嘻更健康') 13 func() # inner()
1.3函数带参数的装饰器
1 import time 2 def timmer(f): 3 def inner(*args,**kwargs): 4 start_time = time.time() 5 time.sleep(0.1) 6 f(*args,**kwargs) 7 end_time = time.time() 8 print('----> 执行效率%s' % (end_time - start_time)) 9 return inner 10 @timmer # func1 = timmer(func1) 11 def func1(a,b): 12 print('%s和%s嘻嘻更健康' %(a,b)) 13 func1('萌哥','杀毒软件')
1.4 带返回值的装饰器
1 import time 2 def timmer(f): 3 def inner(*args,**kwargs): 4 start_time = time.time() 5 time.sleep(0.1) 6 ret = f(*args,**kwargs) # 222 7 end_time = time.time() 8 print('----> 执行效率%s' % (end_time - start_time)) 9 return ret 10 return inner 11 12 @timmer # func = timmer(func) 13 def func(a): 14 return 222 15 print(func('萌哥'))
1.5 通用装饰器
1 def wrapper(func): 2 def inner(*args,**kwargs): 3 '''执行函数前操作''' 4 ret = func(*args,**kwargs) 5 '''执行函数后的操作''' 6 return ret 7 return inner 8 9 @wrapper 10 def func(): 11 print(66) 12 func()
1.6 查看函数信息
1 from functools import wraps 2 3 def deco(func): 4 @wraps(func) #加在最内层函数正上方 5 def wrapper(*args,**kwargs): 6 return func(*args,**kwargs) 7 return wrapper 8 9 @deco 10 def index(): 11 '''哈哈哈哈''' 12 print('from index') 13 14 print(index.__doc__) 15 print(index.__name__)
二、开放封闭原则
1.对扩展是开放的
必须允许代码扩展、添加新功能。
2.对修改是封闭的
防止误操作
三、带参数的装饰器
1 flag =False 2 def outer(flag): 3 def timer(func): 4 def inner(*args,**kwargs): 5 if flag: 6 print('''执行函数之前要做的''') 7 re = func(*args,**kwargs) 8 if flag: 9 print('''执行函数之后要做的''') 10 return re 11 return inner 12 return timer 13 14 @outer(flag) 15 def func(): 16 print(111) 17 func()
四、多个装饰器
def wrapper1(func): def inner(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner def wrapper2(func): def inner(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner @wrapper2 @wrapper1 def f(): print('in f') f()