美文网首页
【Python】-018-函数-装饰器

【Python】-018-函数-装饰器

作者: 9756a8680596 | 来源:发表于2017-08-21 23:23 被阅读10次
    1. 装饰器:对函数进行加工处理,生成一个功能增强版的一个函数
    • 装饰器的参数是一个函数或类,专门对类或函数进行加工处理,装饰器就是一种闭包,返回值可以使任意类型
    1. 装饰器在导入时就被执行,执行的顺序是导入的顺序
    • 例子1——无嵌套结构装饰器

      ##  装饰器在被装修函数前,而且导入时就被执行
      # -*- coding: utf-8 -*-
      def decoFunc(f):
          print "Before", f.__name__," function called."  #传递函数f,没有参数传入
          return f
      
      def function1():
          print "Fucntion 1 called"
      
      @decoFunc
      def fucntion2():
          print "Function 2 called"
      
      if __name__ == "__main__":
          ## pass
          decoFunc(function1)()
          fucntion2()
      
    1. 变更需求,要求:避免装饰器被提前执行,不改变原有函数调用方式,原有函数需要有参数传递
    • 惰性计算,还没有运行,只是声明

    • 例子2——2层嵌套结构装饰器

      import time
      
      def timeInterval(doSomething):
          def nestedFuction(* tuple, **dicts):  #保证参数掺入,用动态参数,一个*表示元组,**表示字典
              startTime = time.clock()
              a = doSomething(*tuple, **dicts)
              print "arguments: ",args, dicts
              endTime = time.clock()
              print doSomething.__name__, "run cost time is ", endTime-startTime
              return a
          return nestedFuction  ##导入时执行,但是仅仅声明函数,并不会影响原有逻辑
      
      @timeInterval
      def listComp(length):
          return [(x, y) for x in range(length) for y in       range(length) if x*y>25]
      
      @timeInterval
      def forComp(xlen, ylen):
          temp = []
          for i in range(xlen):
              for j in range(ylen):  
                  if i*j>25:
                      temp.append((i,j))
          return temp
      
      if __name__ == "__main__":
          a = listComp(1000)  ##不改变原有函数调用方式
          b = forComp(1000, 1000)
      
          print a  #a 是返回值
          print b
      
    1. 装饰器函数本身如果带参数,需要怎么调整
    • 更多层级的嵌套,3层嵌套,最外层为装饰器函数本身,其余两层和之前的一致

        #!/usr/bin/env python
        # coding: utf-8
      
        import time
      
        def timeInterval(timeF):  ## 装饰器外层函数接受参数timeF,计时函数
            def decorator(doSomething):  ##装饰器接受被装饰函数为参数
                def nestedFuction(*args):  ## 嵌套函数接受被装饰函数的接受参数
                    startTime = timeF()
                    a = doSomething(*args)
                    print "arguments: ",args
                    endTime = timeF()
                    print doSomething.__name__, "run cost time is ", endTime-startTime
                    return a
                return nestedFuction
            return decorator
      
        @timeInterval(time.clock)
        def listComp(length):
            return [(x, y) for x in range(length) for y in range(length) if x*y>25]
      
        @timeInterval(time.clock)
        def forComp(xlen, ylen):
            temp = []
            for i in range(xlen):
                for j in range(ylen):  
                    if i*j>25:
                        temp.append((i,j))
            return temp
      
        if __name__ == "__main__":
            a = listComp(1000)
            b = forComp(1000, 1000)

    相关文章

      网友评论

          本文标题:【Python】-018-函数-装饰器

          本文链接:https://www.haomeiwen.com/subject/yjlurxtx.html