Python进阶学习笔记——装饰器(4):从函数的角度切入

装饰器

从函数加功的角度切入

  • 之前讲的都是由闭包的角度切入的,知识点会全部覆盖,但是可能不好理解装饰器有什么,下面是从函数加功的角度切入的,一步步简化成装饰器。
  • 案例:从“”跟着一步步来,看装饰器是如何产生的。
import time
# 一个普通的函数,具有测试函数运行时间的功能
def computation_time0():
    start_time = time.time()  # 开始数时间
    #############
    time.sleep(2)
    #############
    end_time = time.time()  # 结束时间
    run_time = (end_time - start_time) * 1000
    print('程序一共运行了{}毫秒'.format(run_time))

my_fun()

第①步:产生需求。

  • ####包裹的部分,可不可改成其他函数,这样computation_time0函数就变成了一个测试其他函数运行时间的功能函数了。
def computation_time1(every_fun):
    start_time = time.time()
    #############
    every_fun()
    #############
    end_time = time.time()
    run_time = (end_time - start_time) * 1000
    print('程序一共运行了{}毫秒'.format(run_time))

def my_fun0():
   print('我是my_fun0,一个普通函数,我先睡会儿') 
   time.sleep(2)

# 调用computation_time1函数计算myfun2的运行时间
computation_time1(my_fun2)

第②步:改变调用思路。

  • 能不能在调用my_fun候就自动实现计算时间的功能呢?要不每次都用功能函数很麻烦。
  • 就好像圣斗士打架之前每次都需要先穿上圣衣,打完就脱了,现在实现穿一次后就不脱了。
def computation_time2(every_fun):
    def new_every_fun():
        start_time = time.time()
        every_fun()
        end_time = time.time()
        run_time = (end_time - start_time) * 1000
        print('程序一共运行了{}毫秒'.format(run_time))
    return new_every_fun

# 这里相当于把my_fun2包装了,即重写了(加入了新功能)
# 本质上返回的函数已经不是原来的my_fun2了,只是还用my_fun2这个变量名
my_fun2 = computation_time2(my_fun2)

# 调用几次都会计算运行时间
my_fun2()
my_fun2()

第③步:简化调用。

  • 利用Python中的装饰器语法糖——“@”实现函数一出生就穿着“战甲”,根本不用去穿。
@computation_time2
def my_fun3():
    print('我是my_fun3,一个普通的函数,从我出生就被穿上了计算运行时间的战甲')
    time.sleep(2)

my_fun3()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼义II虎神

打赏5C币,作者可获得4C币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值