装饰器相关
Posted simonsun002
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关相关的知识,希望对你有一定的参考价值。
高阶函数的两种情况:
1、
把一个函数名当成实参传给另外一个函数(在不修改被装饰函数源代码的情况下,为其添加功能)
import time def bar(): time.sleep(2) print(‘in the bar‘) def test1(fun_name): t1 = time.time() fun_name() print(‘run time:%s‘%(time.time()-t1)) test1(bar)
2、
返回值中包含函数名(不修改调用方式)
import time def bar(): time.sleep(2) print(‘in the bar‘) def test1(fun_name): return fun_name bar = test1(bar) bar()
高阶函数+嵌套函数则得到装饰器
import time def timer(fun_name): def deco(): start_time = time.time() fun_name() end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco def bar(): time.sleep(2) print(‘in the bar‘) bar = timer(bar) bar()
但我们一般把装饰器在被装饰函数前面定义,并且用如下的写法代替:
import time def timer(fun_name): def deco(): start_time = time.time() fun_name() # 在这里调用是bar()这个函数 end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco @timer # bar = timer(bar) 这步其实是调用了timer()这个函数,把bar这个函数进行重新定义 def bar(): time.sleep(2) print(‘in the bar‘) bar() # 在调用bar的时候,其实调用的是deco()这个函数
可以理解为,先用第一种高阶函数加上想要的功能,再重新覆盖定义这个函数,再用函数嵌套,就得到了我们想要的装饰器的效果
如果有参数:
import time def timer(fun_name): def deco(*args,**kwargs): start_time = time.time() fun_name(*args,**kwargs) end_time = time.time() print(‘running time:%s‘ % (end_time - start_time)) return deco @timer # bar = timer(bar) def bar(): time.sleep(2) print(‘in the bar‘) @timer def bar2(name,age): print(name,age) bar() bar2(‘simon‘,22)
以上是关于装饰器相关的主要内容,如果未能解决你的问题,请参考以下文章