装饰器

Posted heheda123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
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 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("输入有误. 请重新选择!")

  




以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码