python3 装饰器
发布时间:2020-12-17 17:01:13 所属栏目:Python 来源:网络整理
导读:装饰器:本质就是函数,功能是为其他函数添加附加功能。 装饰器两大原则: ? ? 1、不修改被修饰函数的源代码 ? ? 2、不修改被修饰函数的调用方式 计算单个函数运行时间示例: import?timedef?test(l):????start_time?=?time.time()????res?=?0????time.sleep(1)
装饰器:本质就是函数,功能是为其他函数添加附加功能。 装饰器两大原则: ? ? 1、不修改被修饰函数的源代码 ? ? 2、不修改被修饰函数的调用方式 计算单个函数运行时间示例: import?time def?test(l): ????start_time?=?time.time() ????res?=?0 ????time.sleep(1) ????for?i?in?l: ????????res?+=?i ????stop_time?=?time.time() ????print('函数运行的时间:{}'.format(stop_time-start_time)) ????return?res print(test(range(100))) 如果计算一万个函数中每个函数运行时间,按照以前写法只能一个函数一个函数添加。工作量非常。如果是生产环境中函数,根本不能按照这样一个一个函数添加代码。 使用装饰器示例: import?time #?高阶函数 def?timmer(func): ????def?wrapper(*args,?**kwargs): ????????start_time?=?time.time() ????????res?=?func(*args,?**kwargs) ????????stop_time?=?time.time() ????????print('函数运行的时间:{}'.format(stop_time?-?start_time)) ????????return?res ????return?wrapper 用法: @timmer def?test(l): ????res?=?0 ????time.sleep(1) ????for?i?in?l: ????????res?+=?i ????return?res print(test(range(100))) 装饰器的知识储备: 装饰器 = 高阶函数 + 函数嵌套 + 闭包 高阶函数: 1、函数接受的参数是一个函数名 2、函数的返回值是一个函数名 3、满足上述条件任意一个,都可称之为高阶函数 高阶函数模拟高阶函数代码示例: def?test(func): ????return?func def?foo(): ????print('来自函数foo') res?=?test(foo) res() foo?=?test(foo) foo() 来自函数foo 来自函数foo 该示例满足了装饰器第二个条件,可以不修改被修饰函数调用方式,但是问题是没有为被修饰函数添加新功能 import?time def?test(func): ????start_time?=?time.time() ????func() ????stop_time?=?time.time() ????print('函数运行的时间:{}'.format(stop_time?-?start_time)) ????return?func ???? def?foo(): ????print('来自函数foo') ????time.sleep(2) ???? foo?=?test(foo) foo() 来自函数foo 函数运行的时间:2.0016732215881348 来自函数foo 该示例满足了装饰器第一个条件,可以不修改被修饰函数源代码,为被修饰函数foo添加新功能,问题是,修改了foo调用方式。 函数嵌套: ? ? 函数套函数 函数嵌套代码示例: def?father(name): ????print('from?father?{}'.format(name)) ????def?son():????????#?函数即变量 ????????print('我的爸爸是{}'.format(name)) ????print(locals()) ???? father('xiaoming') from?father?xiaoming {'son':?<function?father.<locals>.son?at?0x000001ADA5B25BF8>,?'name':?'xiaoming'} 高级示例: def?father(name): ????print('from?father?{}'.format(name)) ????def?son(): ????????print('from?son') ????????def?grandson(): ????????????print('from?grandson') ????????grandson()?#?执行函数 ????son()??????????#?执行函数 ???? ???? father('xiaoming') 闭包:在一个作用域里放入定义变量,相当于打一个包 ? ? 包→嵌套 ? ? 闭→封装 def?father(name): ????print('from?father?{}'.format(name)) ????def?son(): ????????print('我的爸爸是{}'.format(name)) ????????def?grandson(): ????????????print('我的爷爷是{}',format(name)) ????????grandson()?#?执行函数 ????son()??????????#?执行函数 ???? ???? father('xiaoming') 装饰器框架: import?time #?装饰器框架 def?timmer(func): ????def?wrapper(): ????????func() ????return?wrapper #?装饰器框架 ???? def?test(): ????time.sleep(3) ????print('test函数运行完毕') test?=?timmer(test)??#?返回wrapper的内存地址 test()???????????????#?执行wrappper() 注意:@timmer?相当于?test?=?timmer(test) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |