caicaix

导航

装饰器

装饰器的简易版本

不改变函数内部代码和调用方式的前提下增加额外的功能

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')

 

posted on 2023-05-31 18:43  菜CAIx  阅读(8)  评论(0编辑  收藏  举报