- 装饰器:对函数进行加工处理,生成一个功能增强版的一个函数
- 装饰器的参数是一个函数或类,专门对类或函数进行加工处理,装饰器就是一种闭包,返回值可以使任意类型
- 装饰器在导入时就被执行,执行的顺序是导入的顺序
-
例子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()
- 变更需求,要求:避免装饰器被提前执行,不改变原有函数调用方式,原有函数需要有参数传递
-
惰性计算,还没有运行,只是声明
-
例子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
- 装饰器函数本身如果带参数,需要怎么调整
-
更多层级的嵌套,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)
网友评论