美文网首页
【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-函数-装饰器

    装饰器:对函数进行加工处理,生成一个功能增强版的一个函数 装饰器的参数是一个函数或类,专门对类或函数进行加工处理,...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • python 装饰器 补充

    重新理解python 装饰器 python 装饰器是一个函数,被装饰器所装饰的代码块最终也是一个函数这个对于一般的...

  • Flask 视图和路由的进阶技能

    视图装饰器 Python 装饰器是用于转换其它函数的函数。当一个装饰的函数被调用的时候,装饰器也会被调用。接着装饰...

  • 解析Python中的装饰器

    python中的函数也是对象,函数可以被当作变量传递。 装饰器在python中功能非常强大,装饰器允许对原有函数行...

  • 理解 Python 装饰器与回调函数

    1.理解 Python 装饰器2.Python装饰器和回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数...

  • 函数装饰器(Function Decorators)

    函数装饰器(Function Decorators) python中函数装饰器的使用和Java中注解类似, 直接在...

  • 解惑,从新认识python装饰器

    概念 python有两种装饰器: 函数装饰器(function decorators) 类装饰器(class de...

  • 装饰器函数

    在Python有一类特殊的函数,叫装饰器函数。装饰器函数可以在函数的调用的时候,将装饰器的内容注入到函数之中。在定...

  • python Decorator (装饰器)

    Python 装饰器Python 装饰器 Decorator 使用kotlin的时候发现有个函数很好玩 measu...

网友评论

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

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