python中函数的参数也可以是函数,在多个函数需要实现相同代码时也可以考虑使用装饰器进行处理。
假设以下场景,需要进行查询及查看个人主页操作,那么在此操作之前一般需要先登录系统,此时就可以将登录函数写成装饰器函数
1 def login(fun): #装饰器函数格式,函数内层在定义一个函数,同时函数返回内层函数本身,相当于是执行内层函数msg 2 def msg(): 3 print('登录成功') 4 fun() 5 return msg 6 7 @login #装饰器login 8 def search1(): #一旦函数被装饰,自动执行装饰器函数login,且该函数相当于装饰器的参数 9 print('查询成功') 10 11 @login 12 def profile(): 13 print('欢迎你查看个人主页')
以上代码,login为装饰器函数,search1、profile为被装饰器函数,详细的解释这个代码的意思:
1、自动执行login函数并且将被装饰的函数当作login函数的参数来处理
2、将login函数的返回值msg重新赋值给被装饰的函数
3、一旦结合了装饰器,调用被装饰的函数本质上是执行msg()函数
4、函数被装饰之后,被装饰的函数重新赋值给装饰器的内层函数
下面看一下被装饰函数有参数的情况
1 def loginxt(fun): 2 def msg(*args,**kwargs): 3 r = fun(*args,**kwargs) 4 if r: 5 return r 6 return msg 7 8 @loginxt 9 def order(name,pwd): 10 if name=='admin' and pwd=='123456': 11 return ('欢迎你登录系统') 12 else: 13 return ('请先登录系统') 14 15 16 print(order('admin','123456'))