python装饰器的使用
python装饰器的概念
装饰器:本质上就是一个闭包函数(即定义了一个嵌套函数,内层函数调用外层函数的值,不包括全局变量只是在函数内部内调用)
装饰器作用:在不修改原有调用函数的基础上,给函数增加额外的功能
解释:即不修改原有函数代码,在函数执行前后增加新的功能
使用场景:用户登录,日志等
python装饰器的使用
通过下面例子来看一下,不使用@装饰器名
def guanji(game):
def inner():
print('start外挂')
game() # 此时这份参数就变成了lol() 那么此时执行的的时候就会到lol中执行lol定义的函数;
print('end外挂')
return inner # 不能加括号,加括号表示将目标函数的执行的结果返回,不加表示返回内层函数,相当于返回inner()函数,需调用
def lol():
print('"德玛西亚"--放技能')
dd = guanji(lol)
dd()
执行结果如下:
@装饰器名,
通过@装饰器名调用,随时用可以随时调。
def guanji(game):
def inner():
print('start外挂')
game() # 当调用loj()此时game()参数就变成了lol() 那么此时执行的的时候就会到lol中执行lol定义的函数;
print('end外挂')
return inner
@guanji #等同于lol = guanji(lol),
def lol():
print('"德玛西亚"--放技能')
lol() # 调用
使用解析
"""
def wrapper(fn): #wrapper:装饰器,fn:目标函数
def inner():
#目标函数执行前...
res = fn() #调用的函数
#目标函数执行后...
return res
return inner #不能加括号,加括号表示将目标函数的执行的结果返回,
#调用
@wrapper
def target():
pass
target() #--->inner()
不加表示返回内层函数,相当于返回inner()函数,需调用
“”"
python装饰器-传递参数
"""
def guanjia(game):
def inner(usr,pwd):
print('start外挂')
game(usr,pwd)
print('end外挂')
return inner
#lol=guanjia(lol),这是返回值为inner(),通过lol调用的时,给了参数,那么执行inner()如果没参数,那么就会报错,所以inner也需要设置
跟lol形式参数,game参数已经用lol()代替,lol中有参数,那么game()没有,也会报错缺失参数,所以也需要定义要调用函数的形式参数,
总之呢,lol()是要装饰的函数,那么lol()有的参数就需要在inner()及game()定义
@guanjia
def lol(usr,pwd):
print('使用的账号是{},密码是{}'.format(usr,pwd))
print('德玛西亚-放大招')
@guanjia
def cf(usr,pwd,zhuangbei):
print('使用的账号是{},密码是{},使用装备'.format(usr,pwd,zhuangbei))
print('cf进攻开始')
lol('admin','123456')
cf('admin','123456','手枪')
#这时调用cf肯定能会报错,因为inner()跟game()只有两个参数,这时候我们为了代码可以更加重复的使用,就要做些修改,
"""
调用lol()结果
调用cf(‘admin’,‘123456’,‘手枪’)
python装饰器 传递参数2
针对实现cf(‘admin’,‘123456’,‘手枪’) 甚至更多参数的情况,我们将参数修改为*args,**kwargs
def guanjia(game):
def inner(*args, **kwargs): #*,**表示将接收的所有参数,分别打包成元组跟字典
print('start外挂')
game(*args, **kwargs) ##*,**表示将接收的args元组,kwargs字典,打散成位置参数跟关键字参数传递进去
print('end外挂')
return inner
@guanjia
def lol(usr, pwd):
print('使用的账号是{},密码是{}'.format(usr, pwd))
print('德玛西亚-放大招')
@guanjia
def cf(usr, pwd, zhuangbei):
print('使用的账号是{},密码是{},使用装备是{}'.format(usr, pwd, zhuangbei))
print('cf进攻开始')
cf('admin', '123456', '手枪')
调用cf(‘admin’, ‘123456’, ‘手枪’)结果如下
多个装饰器调用一个函数
这个有空大家可以研究一下。
python 装饰器实战
编写一个需要登录后才能完成查询,修改操作功能
ogin_status = False
def login():
global login_status
if login_status == False:
while True:
usr = input('>>>输入账号:')
pwd = input('>>>输入密码:')
if usr=='admin' and pwd=='123456':
print('登录成功')
login_status = True
break
else:
print('登录失败,重新输入账号密码')
def wrapper(fn):
def inner():
login()
res = fn()
return res
return inner
@wrapper
def select():
print('查询列表')
@wrapper
def upset():
print('修改列表')
select()
upset()
执行结果: