Python装饰器
来自CloudWiki
闭包
闭包:在内部函数外封装了一层,具体执行时先执行外部函数,更新外部变量,然后再执行内部函数。
def addx(x): def adder(y): return x + y return adder c = addx(8) print(c(10)) #结果: 18
这样做的好处是,可以在不改变原有函数的基础上,通过封装一层壳,实现类似流水线的函数级联调用。可以极大地提高代码的可复用性。
def line_conf(a,b): def line(x): return a * x + b return line line_A = line_conf(2,1) #定义直线A line_B = line_conf(3,2) #定义直线B line_C = line_conf(5,-3) #定义直线C print(line_A(1)) print(line_B(1)) print(line_C(1))
装饰器的概念和使用
装饰器实际上是为了给某程序增添功能,但该程序已经上线或使用,无法大批量的修改源代码。
一般情况下,在满足以下三个条件下装饰器可以使用
1)不能修改被装饰的函数的源代码
2)不能修改被装饰的函数的调用方式
3) 满足1)、2)的情况下给程序增添功能。
例2-22 Python通过闭包来计算函数执行时间
import time #导入时间模块 def timer(func): #封装的闭包函数 def deco(): start = time.time() func() stop = time.time() print(stop - start) return deco def test(): #需要计时的函数 time.sleep(2) print("测试程序!") test = timer(test) #调用闭包函数 test() #最终调用形式
例2-23 使用装饰器计算函数运行时间
import time #导入时间模块 def timer(func): #封装的闭包函数 def deco(): start = time.time() func() stop = time.time() print(stop - start) return deco def test(): #需要计时的函数 time.sleep(2) print("测试程序!") test = timer(test) #调用闭包函数 test() #最终调用形式
最后总结一下,装饰器的存在主要是为了不修改原函数的代码,也不修改函数调用形式 就能实现功能的拓展。