• python语言中的函数装饰器


    装饰器

    1. 什么是装饰器?

      装饰:给已有的对象(函数)添加新的功能

      器:工具              在python中指具备某些功能的函数

      装饰器:装饰器就是一个给其他函数增加功能的函数

    2. 一种设计原则:

      开闭原则:对扩展开放

                       对修改封闭

    3. 装饰器怎么用

    我们用一个例子说明装饰器的作用及用法

    例子: 现需要统计一段程序运行的时间

    #统计程序运行时间,首先我们写一个程序
    import time
    def index():
        time.sleep(1)
        print('login')
    #以上就是一个打印login的程序,该程序休眠时间为1S
    #如果我们要增加一个计时功能,该怎么实现呢?首先我们可以尝试从我们的设计原则入手
    #如果我们按照增加代码的形式可以看下:
    import time
    def index():
        time.sleep(1)
        print('login')
    start=time.time()
    index()
    end = time.time()
    print('程序运行的时间',end-start)
    #或者
    import time
    def index():
        time.sleep(1)
        print('login')
    def wrapper():
        start=time.time
        index()
        end=time.time
        print('程序运行时间',end-start)
     wrapper()
    #如果这样写我们就改变了源码或调用方式,不符合要求
    #那我们按照不改变源码,不改变调用方式
    #利用闭包函数
    import time
    def index():
        time.sleep(1)
        print('login')
    def time_count(func):
        #func=index       #利用闭包函数的将变量func=index带给内部的wrapper函数
        def wrapper():
            start=time.time()
            func()
            end=time.time()
            print('程序运行时间',end-start)
        return wrapper    #time_count函数的返回值为wrapper函数
    index=time_count(index)  #index=wrapper 括号内index为初始的index
    index()   #调用index就可以实现计时功能

    为了让我们作的修改更能灵活,能继续增加功能,并且如果原代码函数有返回值,需要我们将返回值传递出来,我们可以将装饰器改成

    import time
    def time_count(func):
        #func=index       #利用闭包函数的将变量func=index带给内部的wrapper函数
        def wrapper(*args, **kwargs):
            start=time.time()
            res=func(*args, **kwargs)
            end=time.time()
            print('程序运行时间',end-start)
            return res
        return wrapper    #time_count函数的返回值为wrapper函数
    @time_count
    def index():
        time.sleep(1)
        print('login')
        return 123
    res=index()
    print('返回值res',res)

    这就是一个完整的装饰器

  • 相关阅读:
    [转]eclipse转idea, 快捷键设置
    钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid
    SmartSVN has inconsistent newlines解决方法
    解决Mac java.net Local host name unknown error的方法
    Jenkins持续集成环境, 如何自定义 maven repositories
    如何用dat批处理文件关闭某端口对应程序-Windows自动化命令
    ionic 总结
    window resize的时候禁止频繁触发事件
    AJAX工作原理及其优缺点
    利用JS提交表单的几种方法和验证
  • 原文地址:https://www.cnblogs.com/5j421/p/10039019.html
Copyright © 2020-2023  润新知