装饰器
目录
1.定义
在不改变被装饰对象内部代码和调用方式的基础上,从而实现新添功能的工具
2.原则
开放封闭原则
即,对扩展开放/对修改封闭
3.简易版装饰器
给函数添加统计执行时间的功能
# 版本演绎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()
4.装饰器(解决函数传值问题)
# 版本演绎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')
5.装饰器(解决返回值问题)
# 给函数添加统计执行时间的功能
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'))
改进