装饰器
2021/4/24 18:25:36
本文主要是介绍装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
装饰器
-定义:本质是函数,功能是为其他函数添加附加功能
-原则:
1,不修改被修饰函数的源代码
2,不修改被修饰函数的调用方式
装饰器=高阶函数 +函数嵌套 +闭包
高阶函数的定义:
-函数接收的参数是函数名
import time def foo(): time.sleep(0.1) print('你们好啊') def test(func): start_time = time.time() func() end_time = time.time() print('运行时间是:%s'%(end_time-start_time)) test(foo)=======================》此函数接收大参数是函数名,但函数foo()的运行方式改变成了test(foo) 结果是:你们好啊 运行时间是:0.10401010513305664
-函数的返回值也是函数名
import time def foo(): time.sleep(0.1) print('你们好啊') def test(func): start_time = time.time() func() end_time = time.time() print('运行时间是:%s'%(end_time-start_time)) return func foo = test(foo)======>结果是 你们好啊 运行时间是:0.10253691673278809 foo()============>结果是:你们好啊
满足上述任意一个条件都是高阶函数
-函数嵌套
在函数中重新定义一个函数,如下:
def foo(): print('你好') def test(): print('alisa') test() ps:函数也是一个变量
- 闭包类似于作用域
装饰器框架(如下):
def timmer(func): def wrapper(): print(func) func() return wrapper
需要计算以下函数运行的时间,写代码(用装饰器):
import time def timmer(func): def wrapper(): start_time = time.time() func() end_time = time.time() print('程序运行时间是%s'%(end_time-start_time)) return wrapper def test(): time.sleep(0.3) print('到此结束') test = timmer(test)======》此处timmer(test)运行的结果是返回wrapper的地址
test()=======》此处相当于运行wrapper()
注意:上述倒数第二行代码中test = timmer(test)可以换成@timmer 进行简化
可以直接在需要装饰的函数前写上 @装饰器 直接对函数进行装饰
-需要装饰的函数添加返回值:
import time def timmer(func): def wrapper(): start_time = time.time() res = func() end_time = time.time() print('程序运行时间是%s'%(end_time-start_time)) return res return wrapper @timmer def test(): time.sleep(0.3) print('到此结束') return 'ni' res =test() print(res)
运行结果是:
到此结束
程序运行时间是0.3040931224822998
ni
- 需要装饰的函数加上多个参数
import time def timmer(func): def wrapper(*args,**kwargs): ======>注意:*args:上传的是以()元祖的形式,例如:(1,2,3,4)**kargs 上传的是字典的形式 如:(name = alisa) start_time = time.time() res = func(*args,**kwargs) end_time = time.time() print('程序运行时间是%s'%(end_time-start_time)) return res return wrapper @timmer def test(age,name): time.sleep(0.3) print('到此结束','年龄是【%s】,名字是【%s】'%(age,name)) return 'ni' test(12,'lisa')
ps: 补充技巧 如下:
ni = [21,23,22,33,44,55,88,55] 求第一位元素 a,*_d =ni=====》a代表第一位元素,d代表最后一位元素 *代表中间元素,_代表不显示 print(a)======>第一位元素是 21 求第一位和最后一位元素 a,*_,d=ni print(a,d)====》21,55
将a = 1 b = 2 变成 a = 2,b = 1 a,b=2,1 print(a,b)====结果是2,1
这篇关于装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)