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已经装饰过的方法
    # 装饰器会对原函数的原信息进行更改

  • 相关阅读:
    Linux学习(一)-安装vm虚拟机以及如何在虚拟机上安装Centos系统
    HTML DOM总结
    如何在eclipse中安装angularjs插件
    wfp(Application的运用)
    wpf(第一章 基础知识)
    二叉搜索树的深度&广度优先遍历 C++实现
    Python 实现公式图像识别转 Latex(Mathpix)
    机器学习基石 之 逻辑回归(Logistic Regression)
    机器学习技法 之 聚合模型(Aggregation Model)
    机器学习技法 之 决策树(Decision Tree)
  • 原文地址:https://www.cnblogs.com/peipei-Study/p/12095381.html
Copyright © 2011-2022 走看看