• 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)    #执行函数
  • 相关阅读:
    IDEA中用jetty启动项目时,url 404
    Mysql 性能查询
    RabbitMQ 安装
    Ubuntu安装kubernetes
    .net 4 调用WCF时报错 Type 'System.Threading.Tasks.Task`1[]' cannot be serialized
    Windows XP SP2上安装.net 4
    angular学习的一些Mark
    [转]对 td 使用 overflow:hidden; 无效的几点错误认识
    静态方法与非静态方法的区别
    二进制字符串的权限管理
  • 原文地址:https://www.cnblogs.com/zhangxinqi/p/8000205.html
走看看 - 开发者的网上家园