一、装饰器
装饰器的存在是为了实现开放封闭原则:
- 封闭: 已实现的功能代码块不应该被修改;
- 开放: 对现有功能的扩展开放。
理解装饰器的三要素:
- 函数的作用域
- 高阶函数
- 闭包
1. 闭包
闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
def test_1(x = 20): def test_2(): # 条件一: test_2就是内部函数 print(x) # 条件二: 对外部函数变量的引用 return test_2() # 结论: 内部函数test_2就是一个闭包 test_1()
2. 装饰器的应用
现在有如下一段代码,需要测算出代码的执行时间。
def foo(): print('foo...') foo()
对功能进行扩展:
由于代码执行太快,使用sleep暂停2s,此次修改没有执行开放封闭原则,修改了原代码。
import time def foo(): start = time.time() print('foo...') time.sleep(2) end = time.time() print(end - start) foo()