装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
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 @wrapper def func(): pass func() |
带参数的装饰器
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 @wrapper3 def 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 inner def chakan(): print ( "==============================查看" ) @login_verify def tianjia(): print ( "============================添加" ) @login_verify def xiugai(): print ( "=======================修改" ) @login_verify def 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 ( "输入有误. 请重新选择!" ) |