python3之装饰器
1、装饰器
装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
装饰器的实现原理:
#无参数装饰器原理: def login(funct): print('passed user veriftcation...') return funct #函数返回形参的值或内存地址 def tv(): print('welcom to TV page') tvv= login(tv) #执行login函数,参数tv返回tv函数的内存地址 tvv() #执行生成器函数将执行tv函数
传参数装饰器原理:
#实例:实现程序执行前的验证 def login(funct): #验证函数 def inner(arg): #嵌套函数是为了不让验证函数不执行 print('passed user veriftcation...') funct(arg) return inner #将内嵌函数内存地址返回给login @login #@是装饰器的语法糖,它实际就是等于tv=login(tv) def tv(name): #执行程序函数 print('welcom %s to TV page' %name) #tv = login(tv) #相当与@login,与装饰器的作用一样 tv('zhang') #执行程序前,通过装饰器验证 #上面程序执行原理说明: #程序执行后,首先扫描程序内的装饰器(@login)执行后,跳转到装饰器函数 #将函数读取到内存,login将返回inner函数的内存地址,执行tv时,首先执行inner函数,tv参数‘zhang’传递给inner,打印输出,funct参数值为tv,执行funct后就会执行tv函数。理解装饰器原理就是把tv函数包起来执行,先验证后执行。
装饰器下的函数返回值:
def login(funct): def inner(*args,**kwargs): print('passed user veriftcation...') return funct(*args,**kwargs) #inner的返回值就是tv的返回值 return inner #@login def tv(*args,**kwargs): print('welcom %s to TV page %s' %(args,kwargs)) return 88 #返回值 tv = login(tv) dic = {'k1':'v1','k2':'v2'} li = ['python','java'] t = tv(dic,li) print(t)
装饰器带传参函数,多层装饰器:
#验证函数 def login(*args,**kwargs): print('%s登陆验证%s!'%(args,kwargs)) #登陆后操作 def quanxian(*args,**kwargs): print('%s登陆后操作!%s'%(args,kwargs)) #装饰器 def decorator(login_func,quanxian_func): #传参2个函数 def inner(index_func): #传参登陆函数 def inner2(*args,**kwargs): #接收index的传参 login_func(*args,**kwargs) #执行login函数 index_func(*args,**kwargs) #执行index函数 quanxian_func(*args,**kwargs) #执行quanxian函数 return inner2 #返回函数地址 return inner #返回函数地址 @decorator(login,quanxian) #执行装饰器 def index(*args,**kwargs): #登陆函数 print('登陆后台!%s,%s'%(args,kwargs)) l1 = [1,2,3,4] dic = {'k1':'v1','k2':'v2'} index(l1,dic) #执行函数