python学习笔记(4)装饰器

python学习笔记(4)装饰器,第1张

概述##所谓装饰器就是在不改变原来函数的调用方式的情况下,给函数添加新功能。#例如我们有求和函数如下:defsumm(x=0,y=0):sum1=x+ytime.sleep(0.1)returnsum1#此时我们需要给该函数添加一个新功能,计算函数执行所花费的时间,由于该函数已经被其他模块
# # 所谓装饰器就是在不改变原来函数的调用方式的情况下,给函数添加新功能。# 例如我们有求和函数如下:def summ(x = 0, y = 0):    sum1 = x + y    time.sleep(0.1)    return sum1# 此时我们需要给该函数添加一个新功能,计算函数执行所花费的时间,由于该函数已经被其他模块调用,所以函数名不能改# 同时,其他函数在调用summ(x, y)时,需要有计算函数执行时间的功能。# 于是利用高阶函数的思维,将summ(x, y)函数作为一个参数传入另外一个函数,如下:def timer(summ):    time1 = time.time()    summ()    time2 = time.time()    print('执行时间为:', time2 - time1)timer(summ)'''执行结果:执行时间为: 0.10826659202575684'''# 这样虽然实现了功能,但是需要修改所有调用改函数的模块,将summ()修改问timer(summ),这样不满足封闭原则# 所以这里我们需要将在不改变函数的调用方式的情况下,完成新功能的添加,于是调整如下:def timer(func):    def inner():        time1 = time.time()        func()        time2 = time.time()        print('执行时间为:', time2 - time1)    return innerprint('*'*100)summ = timer(summ)summ()'''执行结果:****************************************************************************************************执行时间为: 0.10765576362609863'''# 这样我们既实现了新功能,又能保证调用方式不变,接下来需要解决传参和返回值的问题# 先看返回值,summ函数是计算两个值的和,需要返回两值的和,所以需要将和返回,如下:def summ(x = 0, y = 0):    sum1 = x + y    time.sleep(0.1)    return sum1def timer(func):    def inner():        time1 = time.time()        ret = func()        time2 = time.time()        print('执行时间为:', time2 - time1)        return ret    return innerprint('*'*100)summ = timer(summ)sum1 = summ()print(sum1)'''执行结果为:****************************************************************************************************执行时间为: 0.109432697296142580----这就是返回值'''# 接下来需要解决传参的问题,我们的summ函数需要提供两个参数,但是由于我们这个装饰函数可能装饰不同的函数,不同的函数的参数个数可能不一致# 所以这里需要写成接收任意参数(*args, **kwargs),如下:def summ(x = 0, y = 0):    sum1 = x + y    time.sleep(0.1)    return sum1def timer(func):    def inner(*args, **kwargs):        time1 = time.time()        ret = func(*args, **kwargs)        time2 = time.time()        print('执行时间为:', time2 - time1)        return ret    return innerprint('*'*100)summ = timer(summ)sum1 = summ(2, 5)print(sum1)'''执行结果:****************************************************************************************************执行时间为: 0.108758926391601567----这就是传参之后求和的结果'''# 这样这个装饰器就完成了,在python中有一种简单的方式来表示装饰器,就是用@加上装饰函数,写在被装饰函数的前面,如下:@timerdef summ(x = 0, y = 0):    sum1 = x + y    time.sleep(0.1)    return sum1print('*'*100)sum1 = summ(6, 5)print(sum1)'''执行结果:****************************************************************************************************执行时间为: 0.1071488857269287111'''# 这样装饰器就讲完了。

 

总结

以上是内存溢出为你收集整理的python学习笔记(4)装饰器全部内容,希望文章能够帮你解决python学习笔记(4)装饰器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1186015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存