python3之装饰器

Posted Py.qi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)    #执行函数

 

以上是关于python3之装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python3+selenium-unittest之装饰器(@classmethod)

python使用上下文对代码片段进行计时,非装饰器

python3 装饰器应用举例

Python3 装饰器

python3 装饰器

python3-装饰器