装饰器
装饰器的简易版本
不改变函数内部代码和调用方式的前提下增加额外的功能
1.时间统计(最初)
1 import time 2 def jisuan_time(func): 3 def get_time(): 4 kais = time.time() 5 func() 6 end_time = time.time() 7 print(end_time - kais) 8 return get_time 9 10 def index(): 11 time.sleep(2) 12 print('index') 13 14 index = jisuan_time(index) 15 index()
2.有参数版本
1 import time 2 def jisuan_time(func): 3 def get_time(*args, **kwargs): 4 kais = time.time() 5 func(*args, **kwargs) 6 end_time = time.time() 7 print(end_time - kais) 8 return get_time 9 10 def index(): 11 time.sleep(2) 12 print('index') 13 14 index = jisuan_time(index) 15 index()
3.有返回值版本
1 def jisuan_time(func): 2 def get_time(*args, **kwargs): 3 kais = time.time() 4 res = func(*args, **kwargs) 5 end_time = time.time() 6 print(end_time - kais) 7 return res 8 return get_time 9 10 def index(): 11 time.sleep(2) 12 print('index') 13 14 index = jisuan_time(index) 15 index()
登录认证装饰器
1 def login(func): 2 def login_get(*args, **kwargs): 3 name = input('请输入用户名:') 4 mima = input('请输入密码:') 5 6 if name == 'kevin' and mima == '123': 7 print('登录成功') 8 res = func() 9 return res 10 else: 11 print('用户密码错误') 12 return login_get 13 14 @login 15 def index(): 16 print('index')
装饰器固定模板(语法糖)
语法糖:
就是代替 index = a(index)的结构
def a(func): def inner(*args, **kwargs): ''' 装饰器所需要实行的内容 ''' res = func(*args, **kwargs) return res return inner
@a def index(): pass index()
双重语法糖
双重语法糖从下往上走、多重语法糖也是一样的道理,最后都是index = 最上层修饰器(下一层修饰器内部函数)
1 def a(func): 2 print('a') 3 4 def inner_a(*args, **kwargs): 5 print('inner_a') 6 res = func(*args, **kwargs) # 4.inner_b = func 调用inner_b 7 return res 8 9 return inner_a 10 11 12 def b(func): 13 print('b') 14 15 def inner_b(*args, **kwargs): 16 print('inner_b') 17 res = func(*args, **kwargs) # 5.index = func 调用 index 18 return res 19 20 return inner_b 21 22 23 @a # 2. index = a(inner_b) 24 @b # 1. inner_b = b(ineer_b) 25 def index(): 26 pass 27 28 29 index() # 3. inner_a = a(inner_b) 调用inner_a
装饰器修复技术
就是确保被装饰的函数不会因装饰器带来异常情况
1 from functools import wraps # 提出 2 def a(func): 3 print('a') 4 @wraps(func) # 装饰 5 def inner_a(*args, **kwargs): 6 print('inner_a') 7 res = func(*args, **kwargs) 8 return res 9 10 return inner_a 11 @a 12 def index(): 13 pass 14 15 index()
有参装饰器
就是带参数的装饰器
1 def outer(source_data,a,b, *argssss, **kwargsssss): 2 # source_data = 'file' 3 def login_auth(func): 4 def auth(*args, **kwargs): 5 # source_data = args[0] 6 if source_data == 'file': 7 # 来自于文件 8 elif source_data == 'mysql': 9 # 来自于mysql 10 elif source_data == 'oracle': 11 # 来自于oracle 12 13 if username =='kevin' and password == '123': 14 print('成功') 15 func() 16 else: 17 print('失败') 18 return auth 19 return login_auth 20 # @login_auth # index=login_auth(index) 21 @outer('file'1,2) 22 def index(): 23 pass 24 25 index('file')