python装饰器(一)

装饰器

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()
原文地址:https://www.cnblogs.com/paopaolee/p/2017105924_lee.html