装饰器定义:python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
装饰器基本结构与使用方法:
def foo(func): '''装饰器函数''' def wrapped(*args, **kwargs): #传入不定参数以适应不同函数的形参数量 '''给原函数添加的功能代码1''' res=func(*args, **kwargs) '''给原函数添加的功能代码2''' return res #原函数的返回值 return wrapped @foo #@foo放在定义函数的前一行,等价于 fun=foo(fun),调用装饰器 def fun(): '''原函数''' pass fun() #此时fun()函数已经被装饰器装饰过。
装饰器实现的基本原理(上述代码为例子):
- @foo,将fun的内存地址传给foo函数进行装饰加工,并返回wrapped地址。
- 运行fun时,实际上是运行foo函数中的wrapped函数。
- wrapped()在不改变原函数代码的前提下,为函数添加了其他功能,运行fun并返回fun的返回值。
装饰器示例:
def tm(func): '''计算函数运行时间''' def wrapped(*args,**kwargs): t_start = time.time() res = func(*args, **kwargs) t_end = time.time() print('函数运行时间:%d' %(t_end - t_start)) return res return wrapped @tm def fun(): print('hello') time.sleep(1) print('world!') return 123456 a = fun() print(a) #----------------------------------------------- hello world! 函数运行时间:1 123456