一、核心思想
在不改变被装饰对象内部代码和原有调用方式的基础之上在添加额外的功能
二、装饰器的实现过程
根据实际需要,一步一步满足需求,完成对装饰器的理解
1、简易版本
给index函数添加统计执行时间的功能
import time def index(): time.sleep(3) print('from index') def home(): time.sleep(2) print('from home') def func(): time.sleep(2) print('from home') def outer(func): # 外层函数 def get_time(): # 内层函数 # 1. 在函数执行之前打一个时间点 start_time = time.time() func() # index() # 2. 在函数执行完毕之后在打一个时间点 end_time = time.time() # 3. 两个时间的差值就是函数的实际执行时间 print("函数执行了:%s秒" % (end_time - start_time)) return get_time # 返回内层函数 # 利用闭包的形式来传参 # res = outer(index) # res:get_time的内存地址 # res() # get_time() home = outer(home) home()
2、
当执行不同的函数,计算不同函数的执行时间,有的函数有参数,有的函数没参数
def index(name, username): time.sleep(3) print('from index') def home(name): time.sleep(2) print('from home', name) def outer(func): def get_time(*args, **kwargs): # 1. 在函数执行之前打一个时间点 start_time = time.time() func(*args, **kwargs) # 原有函数 # 2. 在函数执行完毕之后在打一个时间点 end_time = time.time() # 3. 两个时间的差值就是函数的实际执行时间 print("函数执行了:%s秒" % (end_time - start_time)) return get_time index = outer(index) index('tony', username='tank')
3、
def home(name): time.sleep(2) print('from home', name) def index(): time.sleep(3) print('from index') return 'from index' def outer(func): # func = index def get_time(*args, **kwargs): # func:index # 1. 在函数执行之前打一个时间点 start_time = time.time() res=func(*args, **kwargs) # index() func('tony') # 2. 在函数执行完毕之后在打一个时间点 end_time = time.time() # 3. 两个时间的差值就是函数的实际执行时间 print("函数执行了:%s秒" % (end_time - start_time)) return res return get_time index = outer(index) res=index() print(res)
4、
def outer(func): def inner(*args, **kwargs): print('这个是函数执行之前可以添加的功能') res = func(*args, **kwargs) print('这个是函数执行之后可以添加的功能') return res return inner def index(): print('from index') index = outer(index) index()
5、
6、