在不改变被装饰对象内部代码和调用方式的基础上,从而实现新添功能的工具
开放封闭原则
即,对扩展开放/对修改封闭
给函数添加统计执行时间的功能
# 版本演绎1.0版本 import time # 导入时间模块 # 定义一个被装饰的函数对象 def index(): start_time = time.sleep(2) print('from index >>>') # 定义一个实现实现计时功能的函数 def get_time(): start_time = time.time() index() end_time = time.time() print('函数运行时间:%s' % (end_time-start_time)) get_time()
# 版本演绎2.0版本 # 给函数添加统计执行时间的功能 import time # 导入时间模块 # 定义一个被装饰的函数对象 def index(): start_time = time.sleep(2) print('from index >>>') # 闭包函数,目的是将get_time这个函数名传给index def outer(func): # 定义一个实现实现计时功能的函数 # func = index def get_time(): start_time = time.time() func() end_time = time.time() print('函数运行时间:%s' % (end_time-start_time)) return get_time # 别忘了 index = outer(index) # 这一步是将index函数名传值到outer函数中,最后返还get_time函数名,再复制给假的index变量名 index()
# 版本演绎3.0版本 # 给函数添加统计执行时间的功能 import time # 导入时间模块 # 定义一个被装饰的函数对象 def index(): time.sleep(2) print('from index >>>') def login(name): time.sleep(1) print('%s from login >>>' % name) # 闭包函数 def outer(func): # 定义一个实现实现计时功能的函数 # func = login def get_time(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() print('函数运行时间:%s' % (end_time-start_time)) return get_time login = outer(login) login('alan')
# 给函数添加统计执行时间的功能 import time # 导入时间模块 # 定义一个被装饰的函数对象 def index(): time.sleep(2) print('from index >>>') def login(name): time.sleep(1) # print('%s from login >>>' % name) return 0 print(login('alan')) # 闭包函数 def outer(func): # 定义一个实现实现计时功能的函数 # func = login def get_time(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() # print('函数运行时间:%s' % (end_time-start_time)) return get_time login = outer(login) login('alan') print(login('alan'))
改进