高级玩法---装饰器

一个初学觉得很抽象,但是弄懂之后会觉得非常牛X的东西

装饰器:故名思议,装饰函数的(即---基于原函数结构、代码不变的情况,额外增加函数功能的),函数作为装饰器的参数,所以,绝对的高阶函数。

分析一个简单场景:如下图,左图跟有图效果一样,左图更易理解装饰器执行过程。

高级玩法---装饰器

函数带参数时,装饰器写法
高级玩法---装饰器
装饰器的执行顺序
执行顺序:1>先执行装饰器(所以装饰器顶层的2个print先出来了);2>执行到return wrapper,回去调用wrapper函数,执行wrapper();
3>所以到了第三个print,直到 return 传入的参数func()(也就是执行函数),开始执行函数部分,也就是第4个print
高级玩法---装饰器

捕错装饰器

高级玩法---装饰器

高级玩法---装饰器

装饰器带参数(不要搞混,上面的原函数带参数),其实只是基于第一种简单场景又在外面多包了层而已,规则还是一样,只在最里面的return后面的函数加上括号(加括号表示执行),外层均不加,不然会自动执行(若有误解,忽略这句)

高级玩法---装饰器

多装饰器时,执行顺序

高级玩法---装饰器

用装饰器实现部分登陆验证的例子,需要验证就加装饰器,不需要就不加

vip_info = {'huang':123, 'qing':456, 'long':789}
login_status = False

def login(func):

    global login_status

    if login_status == True:
        print('已经登陆,不必再次登陆,系统直接跳转至下一步')
        pass
    else:
        while True:
            username = input('your username:')
            passowrd = input('your passowrd:')
            if username in vip_info and int(passowrd) == vip_info[username]:
                print('登陆成功!')
                login_status = True
                break
            else:
                print('账号或密码错误!')
    def inner():
        return func()
    return inner

def car1():
    print('欢迎光临[免费区]---1')

def car2():
    print('欢迎光临[免费区]---2')

@login
def car3():
    print('欢迎光临[会员区]---1')

@login
def car4():
    print('欢迎光临[会员区]---2')
不加装饰器效果

高级玩法---装饰器

加装饰器效果

高级玩法---装饰器