装饰器
import time
##现在有一个函数f,并且已经部署在生产环境中了
##函数f
# def f():
# time.sleep(2)
# print("执行f........")
#f()
##挨千刀的产品够有需要添加新需求
##添加需求,假设为算出函数f的执行时间
##法1.在原函数修改功能
# def f():
# start=time.time()
#
# ##原来的功能开始
# time.sleep(2)
# print("执行f........")
# ##原来的功能结束
#
# end=time.time()
# print("执行消耗时间%s"%(end-start))
#f()
###缺点:违背了开放封闭原则(对修改封闭,对扩展开放),代码已经部署在生产环境就不应该直接修改它
##法2.创建新函数,并将函数f作为参数传入新函数,调用
# def show_time(func):
# start = time.time()
# ##执行f
# func()
# end = time.time()
# print("执行消耗时间%s" % (end - start))
# show_time(f)
###缺点:改变了调用方式,团队中其他人员使用时也必须按照你写的函数调用
###到这里,正常的思路是:把一个函数重新赋值给f,这样调用时就可以直接用f(),但是f=show_time(f)是在调用show_time,没有返回值,所以f==None,
##法3.优化show_time,使其返回值为一个函数
def show_time(func):
def inner():
start = time.time()
##执行f
func()
end = time.time()
print("执行消耗时间%s" % (end - start))
return inner
# f=show_time(f)
# f()
###python装饰器语法,在原函数f上添加@show_time
@show_time
def f():
time.sleep(2)
print("执行f........")
####等价于 f=show_time(f)
f()