zoukankan      html  css  js  c++  java
  • 笔记||Python3进阶之装饰器

    # 装饰器
    # 特征: 是用一个@开头的字符串
    # 装饰器通常用来装饰函数、或者类的方法
    # 被装饰后的函数,通常是在原有的函数基础上,会多出增加一点功能
    # 一般来说装饰器本身也是一个函数
    #
    # def test(name):
    #           def test_in():
    #                  print(name)
    #           return test_in
    #
    # func = test('peiyanan')
    # func()

    '''
    逻辑思想:①首先把peiyanan实参传递给test函数
                  ②在执行test函数时,又返回到test_in函数
                  ③执行test_in函数并打印输出
    '''

    # =================================================================================
    # 不带参数的装饰器(装饰器、被装饰函数都不带参数)
    # import time
    # def showTime(func):
    #              def wrapper():
    #                      start = time.time()
    #                      func()
    #                      end = time.time()
    #                      print('spend is {}'.format(end-start))
    #
    #              return wrapper
    #
    #
    #
    # @showTime       # foo = showTime(foo)
    # def foo():
    #         print('foo..')
    #         time.sleep(3)
    #
    #
    # foo()

    '''
    逻辑思想:①首先将foo函数当做参数的形式传递到showTime函数中去
                  ②在执行showTime函数的同时,会先打印出foo函数中的
                  ③然后又将返回给wrapper函数
                  ④最后逕wrapper函数并打印输出
    '''

    # ==================================================================================
    # 带参数的被装饰的函数
    import time
    def showTime(func):
          def wrapper(x, y):
                start = time.time()
                func(x, y)
                end = time.time()
                print('spend is {}'.format(end-start))

          return wrapper


    @showTime       # foo = showTime(foo)
    def foo(x, y):
            print(x+y)
            time.sleep(3)


    foo(4, 5)

    '''
    逻辑思想:①foo函数调用,执行foo函数体并打印输出
                  ②接着showTime函数调用foo(这里foo既可以看做一个参数,也可以看做是一个函数),传递给showTime函数体
                  ③执行showTime函数体,遇到return,又返回给了wrapper函数体
                  ④执行wrapper函数体时,一次执行并最后输出
    '''

    # 使用装饰器的缺点
    # 不要在装饰器之外添加逻辑功能
    # 不能装饰@staticmethod或者@classmethod已经装饰过的方法
    # 装饰器会对原函数的原信息进行更改
    # 装饰器
    # 特征: 是用一个@开头的字符串
    # 装饰器通常用来装饰函数、或者类的方法
    # 被装饰后的函数,通常是在原有的函数基础上,会多出增加一点功能
    # 一般来说装饰器本身也是一个函数
    #
    # def test(name):
    #        def test_in():
    #             print(name)
    #        return test_in
    #
    # func = test('peiyanan')
    # func()

    '''
    逻辑思想:①首先把peiyanan实参传递给test函数
                  ②在执行test函数时,又返回到test_in函数
                  ③执行test_in函数并打印输出
    '''

    # =================================================================================
    # 不带参数的装饰器(装饰器、被装饰函数都不带参数)
    # import time
    # def showTime(func):
    #          def wrapper():
    #                 start = time.time()
    #                 func()
    #                 end = time.time()
    #                 print('spend is {}'.format(end-start))
    #
    #          return wrapper
    #
    #
    #
    # @showTime          # foo = showTime(foo)
    # def foo():
    #        print('foo..')
    #        time.sleep(3)
    #
    #
    # foo()

    '''
    逻辑思想:①首先将foo函数当做参数的形式传递到showTime函数中去
                  ②在执行showTime函数的同时,会先打印出foo函数中的
                  ③然后又将返回给wrapper函数
                  ④最后逕wrapper函数并打印输出
    '''

    # ==================================================================================
    # 带参数的被装饰的函数
    import time
    def showTime(func):
               def wrapper(x, y):
                      start = time.time()
                      func(x, y)
                      end = time.time()
                      print('spend is {}'.format(end-start))

               return wrapper


    @showTime        # foo = showTime(foo)
    def foo(x, y):
             print(x+y)
             time.sleep(3)


    foo(4, 5)

    '''
    逻辑思想:①foo函数调用,执行foo函数体并打印输出
                  ②接着showTime函数调用foo(这里foo既可以看做一个参数,也可以看做是一个函数),传递给showTime函数体
                  ③执行showTime函数体,遇到return,又返回给了wrapper函数体
                  ④执行wrapper函数体时,一次执行并最后输出
    '''

    # 使用装饰器的缺点
    # 不要在装饰器之外添加逻辑功能
    # 不能装饰@staticmethod或者@classmethod已经装饰过的方法
    # 装饰器会对原函数的原信息进行更改

  • 相关阅读:
    结构struct 联合Union和枚举Enum的细节讨论
    ubuntu 查询 修改 时间
    在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
    浅谈Android系统开发中LOG的使用
    如何单独编译Android源代码中的模块
    在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
    在Ubuntu上为Android系统编写Linux内核驱动程序
    在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
    在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
    在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
  • 原文地址:https://www.cnblogs.com/peipei-Study/p/12095381.html
Copyright © 2011-2022 走看看