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)    #执行函数

 

posted @ 2017-12-08 19:26  Py.qi  阅读(2963)  评论(0编辑  收藏  举报