zoukankan      html  css  js  c++  java
  • 02python 装饰器(python函数)

    装饰器的形成过程


     
     
     
    20
     
     
     
     
     
    1
    import time
    2
    
    
    3
    
    
    4
    def func():                      # 定义一个函数
    5
        time.sleep(0.01)
    6
        print('hello world!')
    7
    
    
    8
    
    
    9
    def timer(f):                    # 一个闭包函数,接收一个函数,也叫做装饰器函数
    10
        def inner():
    11
            start = time.time()
    12
            f()                      # 被装饰函数
    13
            end = time.time()
    14
            print(end - start)
    15
        return inner
    16
    
    
    17
    
    
    18
    func = timer(func)
    19
    func()
    20
    
    
     
     
     
    装饰器的定义:把接收函数作为参数,以及返回内部函数的函数称之为装饰器函数        

    语法糖的概念


     
     
     
    20
     
     
     
     
     
    1
    import time
    2
    
    
    3
    
    
    4
    def timer(f):                    # 一个闭包函数,接收一个函数,也叫做装饰器函数
    5
        def inner():
    6
            start = time.time()
    7
            f()                      # 被装饰函数
    8
            end = time.time()
    9
            print(end - start)
    10
        return inner
    11
    
    
    12
    
    
    13
    @timmer                          # 语法糖 @装饰器函数名
    14
    def func():                      # 被装饰函数   # 定义一个函数   # func = timer(func)
    15
        time.sleep(0.01)
    16
        print('hello world!')
    17
    
    
    18
        
    19
    # func = timer(func)
    20
    func()                           # 在调用的时候只要调用func()即可!这才是装饰器
     
     
     
    再次进化        (被装饰的函数有返回值)

     
     
     
    55
     
     
     
     
     
    1
    import time
    2
    
    
    3
    
    
    4
    def timer(f):
    5
        def inner():
    6
            start = time.time()
    7
            f()
    8
            end = time.time()
    9
            print(end - start)
    10
        return inner
    11
    
    
    12
    
    
    13
    @timer
    14
    def func():
    15
        time.sleep(0.01)
    16
        print('hello world!')
    17
        return ‘pontoon on the way!
    18
    
    
    19
    ret = func()
    20
    print(ret)
    21
    
    
    22
    >>>hello world!
    23
    0.010217905044555664
    24
    None        # 打印的结果是None,而不是pontoon on the way!,因为这里接收的是inner函数里面的返回值,而inner函数里面并没有返回值
    25
    
    
    26
    
    
    27
    -------------------------------------------------------------------------------------------------------------------------------------------------------
    28
    import time
    29
    
    
    30
    
    
    31
    def timer(f):
    32
        def inner():
    33
            start = time.time()
    34
            ret = f()                   # 得到传递过来函数的返回值
    35
            end = time.time()
    36
            print(end - start)
    37
            return ret                  # 返回
    38
        return inner
    39
    
    
    40
    
    
    41
    @timer
    42
    def func():
    43
        time.sleep(0.01)
    44
        print('hello world!')
    45
        return 'pontoon on the way!'
    46
    
    
    47
    
    
    48
    # func = timer(func)
    49
    ret = func()
    50
    print(ret)
    51
    
    
    52
    >>>hello world!
    53
    0.010081291198730469
    54
    pontoon on the way!
    55
    
    
     
     
     
    究极进化        (被装饰的函数有参数)


     
     
     
    49
     
     
     
     
     
    1
    import time
    2
    
    
    3
    
    
    4
    def timer(f):
    5
        def inner(*args, **kwargs):
    6
            start = time.time()
    7
            ret = f(*args, **kwargs)        # 得到传递过来函数的返回值
    8
            end = time.time()
    9
            print(end - start)
    10
            return ret                      # 返回
    11
        return inner
    12
    
    
    13
    
    
    14
    @timer
    15
    def func(a, b):
    16
        time.sleep(0.01)
    17
        print('hello world!')
    18
        return 'pontoon on the way!'
    19
    
    
    20
    
    
    21
    # func = timer(func)
    22
    ret = func(1, 2)                        # 这里相当于执行inner()
    23
    print(ret)
    24
    
    
    25
    -----------------------------------------------------------------------------------------------
    26
    # 简化之
    27
    import time
    28
    
    
    29
    
    
    30
    def wrapper(f):
    31
        def inner(*args, **kwargs):
    32
            ret = f(*args, **kwargs)        # 得到传递过来函数的返回值
    33
            return ret                      # 返回
    34
        return inner
    35
    
    
    36
    
    
    37
    @wrapper
    38
    def func(a, b):
    39
        time.sleep(0.01)
    40
        print('hello world!')
    41
        return 'pontoon on the way!'
    42
    
    
    43
    
    
    44
    # func = timer(func(1, 2))
    45
    ret = func(1, 2)                        # 这里相当于执行inner()
    46
    print(ret)
    47
    
    
    48
    
    
    49
    至此简化版的装饰器OK了!
     
     
     
    装饰器的作用                   
            在不修改原函数及其调用方式的情况下对原函数的功能进行拓展        
     
     
    原则:开放闭合原则        
      开放:对拓展时开放的
      封装:对修改是封闭的
     
     
    装饰器的固定模式            

     
     
     
    x
     
     
     
     
     
    1
    def wrapper(f):
    2
        def inner(*args, **kwargs):
    3
            ret = f(*args, **kwargs)          # 被装饰的函数要有接收的参数并且有返回值!
    4
            return ret
    5
        return inner
    6
    
    
    7
    
    
    8
    @wrapper
    9
    def qqxing():
    10
        print(123)
    11
    
    
    12
    
    
    13
    print(qqxing())
     
     
     

    装饰器的进阶

        1、带参数的装饰器
     
        2、多个装饰器装饰同一个函数
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    有趣的话
    Ubuntu Sublime Text 3 搜狗拼音
    linux下查看文件编码及修改编码
    解决Qt5 Creator无法切换输入法(fcitx),Ubuntu中不能使用搜狗输入法录入汉字问题
    linux下 为自己编写的程序 添加tab自动补全 功能
    SSH免密码登录
    ubuntu14.04 无法ping通 mirrors6.ustc.edu.cn
    解决 ubuntu14.04下的gedit中文乱码
    资源记录
    【重新学习C语言】起步篇
  • 原文地址:https://www.cnblogs.com/pontoon/p/10238331.html
Copyright © 2011-2022 走看看