一段代码带你理解“带参数的装饰器”

带参数的装饰器

关于装饰器的理解及调用过程请看我以前的博客:http://www.javashuo.com/article/p-wrzjwawd-cw.html
可是,本人在最近的工做学习中遇到了一些坑,所以又返回头去从新学习并练习了下,下面就用一个例子来讲明一下带参数装饰器的简单使用。

基于带参数装饰器的简单登录:

先上代码:
def outer(type):
    def inner(func):
        def wrapper():
            if type == 'usual':
                username = input('用户名:').strip()
                password = input('密码:').strip()
                if username == 'whw' and password == '123':
                    print('%s 登录成功'%func.__name__)
                    func()
                else:
                    print('%s 登录失败'%func.__name__)
            elif type == 'super':
                print('welcome super func!')
                func()
        return wrapper
    return inner

@outer('usual')
def func_usual():
    print('普通玩家...')

@outer('super')
def func_super():
    print('付费玩家...')

if __name__ == '__main__':
    func_usual()
    print('**********')
    func_super()
上面代码实现的效果是:“超级函数”不用进行认证便可执行,“普通函数”须要认证后才能执行。
咱们能够这样理解:在定义装饰器函数outer时,咱们先赋予他一种外在的“气质”(也就是他带的参数type),若是他的这个“气质”是“吊丝”——usual,那就在内层的执行函数wrapper里为他设置“门槛”;固然若是人家是付费用户,固然能够随心所欲,直接“do as you want~”。对于第二层inner函数,它携带的是具体函数的内存地址,咱们能够理解它是程序的发放者,当知足条件后能够在对应的地方加上()执行——固然根据需求也能够不执行外面的函数。
最后提醒你们,无论是带参数的装饰器仍是不带参数的装饰器,写法都是很固定的,但愿你们多加练习,只有多练才能提高本身的理解,不要眼高手低,致使没必要要的小bug的发生!
最后上运行结果:

相关文章
相关标签/搜索