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

带参数的装饰器

关于装饰器的理解及调用过程请看我之前的博客:https://www.cnblogs.com/paulwhw/p/8683990.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的发生!
最后上运行结果:

posted on 2019-03-14 21:13  江湖乄夜雨  阅读(340)  评论(0编辑  收藏  举报