• python装饰器


    python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

    1、装饰器结构

    def w1(func):
        def inner():
            # 验证1
            # 验证2
            # 验证3
            return func()
        return inner
     
    @w1
    def f1():
        print 'f1'
    

    2、函数装饰器

    1)函数不带参数

    #函数装饰器-函数不带参数
    import time
    def runtime(func):
        def wrapper():
            start = time.time()
            f = func()     # 原函数
            end = time.time()
            print("运行时长:%.4f 秒" % (end-start))
            return f
        return wrapper
    
    @runtime
    def func_a():
        print("func_a")
        time.sleep(0.5)
    
    @runtime
    def func_b():
        print("func_b")
        time.sleep(0.8)
    
    if __name__ == '__main__':
        func_a()
        func_b()
    

     

    2)函数带参数

    #函数装饰器-函数带参数
    import time
    def runtime(func):
        def wrapper(*args,**kwargs):
            start = time.time()
            f = func(*args,**kwargs)     # 原函数
            end = time.time()
            print("运行时长:%.4f 秒" % (end-start))
            return f
        return wrapper
    
    @runtime
    def func_a(a):
        print("func_a")
        print("a="+a)
        time.sleep(0.5)
    
    @runtime
    def func_b(b,c="3"):
        print("func_b")
        print("b="+b)
        print("c="+c)
        time.sleep(0.8)
    
    if __name__ == '__main__':
        func_a("1")
        func_b("2")
    

    3)装饰器带参数

    #函数装饰器-装饰器带参数
    import time
    def runtime(slowly=1):
        def wrapper(func):
            def inner_wrapper(*args, **kwargs):
                start = time.time()
                f = func(*args, **kwargs)     # 原函数
                end = time.time()
                t = end-start
                print("运行时长:%.4f秒"%t)
                time.sleep(slowly)  # 延迟效果
                new_end = time.time()
                print("延时时长:%.4f 秒" % (new_end-start))
                return f
            return inner_wrapper
        return wrapper
    
    @runtime(1.5)
    def func_a(a):
        print("a="+a)
        time.sleep(0.5)
    
    @runtime(0.5)
    def func_b(b, c="c"):
        print("b="+b)
        print("c="+c)
        time.sleep(0.8)
    
    if __name__ == '__main__':
        func_a("a")
        func_b("b", c="c")
    

     3、类装饰器

    1)装饰器不带参数

    #类装饰器-装饰器带参数
    import time
    class runtime:
        def __call__(self, func):
            def inner_wrapper(*args, **kwargs):
                start = time.time()
                f = func(*args, **kwargs)     # 原函数
                end = time.time()
                t = end-start
                print("运行时长:%.4f秒"%t)
                return f
            return inner_wrapper
    
    @runtime()
    def func_a(a):
        print("a="+a)
        time.sleep(0.5)
    
    @runtime()
    def func_b(b, c="c"):
        print("b="+b)
        print("c="+c)
        time.sleep(0.8)
    
    if __name__ == '__main__':
        func_a("a")
        func_b("b", c="c")
    

    2)装饰器带参数

    #类装饰器-装饰器带参数
    import time
    class runtime:
        def  __init__(self,slowly=1):
            self.slowly=slowly
        def __call__(self, func):
            def inner_wrapper(*args, **kwargs):
                start = time.time()
                f = func(*args, **kwargs)     # 原函数
                end = time.time()
                t = end-start
                print("运行时长:%.4f秒"%t)
                time.sleep(self.slowly)  # 延迟效果
                new_end = time.time()
                print("延时时长:%.4f 秒" % (new_end-start))
                return f
            return inner_wrapper
        
    @runtime(1.5)
    def func_a(a):
        print("a="+a)
        time.sleep(0.5)
    
    @runtime(0.5)
    def func_b(b, c="c"):
        print("b="+b)
        print("c="+c)
        time.sleep(0.8)
    
    if __name__ == '__main__':
        func_a("a")
        func_b("b", c="c")
    

    文章内容转载自上海-悠悠:https://www.cnblogs.com/yoyoketang/p/10801242.html

  • 相关阅读:
    前端知识笔记
    Vue 组件设计
    使用 puppeteer 创建一个自动化导出 PDF 的服务
    解决浏览器缓存导致页面非最新的小技巧
    浏览器文件上传浅淡
    Vue 项目代理设置的优化
    「django2」macos系统下安装及创建工程
    「android」gomobile argument unused during compilation: '-stdlib=libc++'
    「linux」大文本文件中查找指定字符串并删除所在行
    「color」颜色RGB
  • 原文地址:https://www.cnblogs.com/crystal1126/p/12809587.html
Copyright © 2020-2023  润新知