• python 装饰器


    装饰器

    • 引入日志
    • 函数执行时间统计
    • 执行函数前预备处理
    • 执行函数后的清理功能
    • 权限校验等场景
    • 缓存

      装饰器其实是一个函数。作用就是为已经存在的函数或对象添加额外的功能,并且函数或对象不需要做任何改变。

    import time
    
    def logger(fun):    #logger就是一个装饰器
        def inner():    #闭包
            print(time.ctime(time.time()))
            fun()
        return inner    #必须要返回inner函数,而不是inner函数执行结果
    
    @logger    #相等于summation=logger(summation),logger(summation)的执行结果为inner
    def summation(): 
        summs = 10 + 20
        print(summs)
    
    summation() 
    
    #执行结果
    Sun Apr 28 15:48:30 2019 
    30

      summation是两个常数求和的函数,logger是一个将函数作为参数fun的装饰器函数,其中封装了一个拥有外部环境的inner函数,函数中打印当前时间并执行参数fun,然后将inner函数返回;如果想在执行summation函数前打印当前时间,就可以直接将summation函数当作参数放入logger函数中运行,即logger(summation),再将执行结果赋值给summation,即summation=logger(summation),这样summation函数中的代码内容没有发生变化,调用方式也没有发生变化,还是summation();python中简单规范的写法为@logger。这样的作用是以后在生产中,可以想要增加一些通用的功能,也不会影响到其他同事对此函数的调用方式。

     函数带参数的装饰器

      针对代码增加一个需求,可以自定义对哪些数值进行求和,那么就需要在summation中加入参数,相应的装饰器也必须增加同样的参数;

    import time
    
    def logger(fun):
        def inner(*args):    #在这儿引入参数到局部作用域中,fun()才可以引用参数,
            print(time.ctime(time.time()))
            fun(*args)    #如果传入的fun带有参数,这儿fun执行也必须带有参数
        return inner
    
    @logger  #summation=logger(summation)=inner
    def summation(*args):    #添加可变参数
        summs = 0
        for i in args:
            summs += i
        print(summs)
    
    summation(1,2,3,4,5)
    
    #执行结果
    Sun Apr 28 16:28:54 2019
    15
    

    装饰器带有参数

      也可以针对装饰器添加参数,只需要再向外嵌套一层。

    import time
    
    def show_time(is_show):
        def logger(fun):
            def inner(*args):
                if is_show == 'asc':
                    print(time.ctime(time.time()))    #以可读模式显示
                elif is_show == 'no':
                    print('no display time')    #不显示
                else:
                    print(time.time())    #以秒显示
                fun(*args)
            return inner
        return logger
    
    @show_time('no')    #传入参数'no'
    def summation(*args):
        summs = 0
        for i in args:
            summs += i
        print(summs)
    
    summation(1,2,3,4,5)
    
    #执行结果
    no display time
    15
  • 相关阅读:
    kubernetes-handbook 阅读笔记
    kubernetes-notes--阅读笔记
    SpringInAction4笔记——复习
    spring源码解析——2容器的基本实现(第2版笔记)
    把node加入master节点时,日志内容分析
    初始化master节点时,日志内容分析
    Mac OS用minikube安装单节点kubernetes
    Mac OS用vmvare安装多节点kubernetes
    FatMouse's Speed 基础DP
    FatMouse and Cheese 动态化搜索
  • 原文地址:https://www.cnblogs.com/houyongchong/p/10784404.html
Copyright © 2020-2023  润新知