装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
通用装饰器语法:def wrapper(fn): def inner(*args, **kwargs): # 聚合 在目标函数之前 ret = fn(*arg, **kwargs) # 打散 在目标函数之后 return ret return inner@wrapperdef func(): passfunc() |
带参数的装饰器
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def wrapper_out(参数): def wrapper(fn): def inner(*args, **kwargs): # 聚合 在目标函数之前 ret = fn(*arg, **kwargs) # 打散 在目标函数之后 return ret return inner return wrapper @wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖 def func(): pass |
多个装饰器装饰同一个函数
|
1
2
3
4
5
6
7
8
9
|
# 就近原则@wrapper1@wrapper2@wrapper3def func(): print("我是可怜的func")func()# 1 2 3 func 3 2 1 |
装饰器的应用
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
menu = ("查看", "添加", "修改", "删除", "退出")flag = False # 没登录def login(): global flag username = input("请输入用户名:") password = input("请输入密码:") if username == "alex" and password == "123": flag = True print("登录") else: flag = False print("用户名密码错误")# 登录验证装饰器def login_verify(fn): def inner(*args, **kwargs): # 登录校验 while 1: if flag == True: ret = fn(*args, **kwargs) return ret else: print('对不起, 您还没有登录') login() return innerdef chakan(): print("==============================查看")@login_verifydef tianjia(): print("============================添加")@login_verifydef xiugai(): print("=======================修改")@login_verifydef shanchu(): print("=========================删除")while 1: for i in range(len(menu)): print(i+1, menu[i]) num = input("请输入你要执行的菜单:") if num == "1": chakan() elif num == "2": tianjia() elif num == "3": xiugai() elif num == "4": shanchu() elif num == "5": print("程序退出中..........") exit() else: print("输入有误. 请重新选择!") |