zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    转载:CODE CSDN Git 配制方法介绍
    版本管理之Git(二):Win7上Git安装及简单配置过程
    Html_color code表示
    Android 自动化测试—robotium(十一) robotium实现微博绑定
    转载:Android自动化测试- 自动获取短信验证码
    Android 自动化测试—robotium(九) Junit_report测试报告重定向输出到终端SDCard
    每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?
    常见的几个Python面试题
    使用python解析Json字符串-获取Json字符串关键字
    Android测试之 APK重签名方法
  • 原文地址:https://www.cnblogs.com/crystal1126/p/12809587.html
Copyright © 2011-2022 走看看