带参数的装饰器
但是,本人在最近的工作学习中遇到了一些坑,因此又返回头去重新学习并练习了下,下面就用一个例子来说明一下带参数装饰器
的简单使用。
基于带参数装饰器的简单登陆:
先上代码:
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的发生!
最后上运行结果: