装饰器是装饰其它函数,为其它函数增加特定功能。在原来的函数上,增加一些限制或制约的条件,称为装饰器。
使用装饰器不会修改原函数的源码,也不会修改原函数的调用方式。
装饰器的基础知识有,函数也是变量,高阶函数,嵌套函数。
函数名和变量名一样只是一个变量的标识符,指向函数定义的内存地址。在函数定义中取调用其它函数时,不会立即调用调用该函数。
高阶函数的两个要求为,在函数形参中可以传递函数,函数的返回值包含函数名。
1 import time 2 def timer(func): #定义装饰器函数 3 def gcf(): #定义一个嵌套函数 4 start_time=time.time() 5 func() #调用作为参数传入的函数名 6 end_time=time.time() 7 print(‘程序运行时间‘,end_time-start_time) 8 return gcf #返回嵌套函数的函数名 9 @timer 10 def foo(): #定义被装饰函数 11 time.sleep(1) 12 print(‘in foo‘) 13 foo() 14 #执行过程 15 #到达第二行,装饰器函数的定义,把装饰器函数整体加载到CPU 16 #到达第九行,语句的执行过程实际是foo=timer(foo),所以执行timer函数 17 #回到第三行,把嵌套函数gcf整体加载到CPU 18 #执行到第八行,返回一个嵌套函数名给装饰器函数timer,也即返回函数名给foo 19 #到达第十四行,执行返回的foo函数,又回到第三行,执行foo函数体 20 #到达第五行,执行func函数,转到第十行 21 #执行了func函数后,依次执行程序,直到结束程序
当被装饰函数中有参数时,参数传递过程遵循一定的规则。被装饰函数中有一个参数,使用以下方式。
import time def timer(func): #定义高阶函数,参数传递foo,装饰foo def gf(name): #定义嵌套函数,装饰foo start_time=time.time() func(name) #执行被装饰函数 end_time=time.time() print(‘程序运行时间‘,end_time-start_time) return gf #在高阶函数中返回嵌套函数 @timer def foo(name): #被装饰函数中有参数 time.sleep(1) print(‘in foo‘,name) foo(‘woniu‘)
被装饰函数有多个参数时,需要使用不定义参数传参
import time def timer(func): def gf(*args,**kwargs): start_time = time.time() func(*args,**kwargs) end_time = time.time() print(‘程序运行时间为‘,end_time-start_time) return gf @timer def foo(name,age): time.sleep(1) print(‘in foo‘,name,age) foo(‘woniu‘,24)
在装饰函数中传递参数,需要使用以下的规则
import time def timer(timer_type): #定义高阶函数作为装饰器,带有参数 def outter(func): #定义嵌套函数,参数为被装饰函数 def inner(*args,**kwargs): #定义嵌套函数,参数为被装饰函数的参数 start_time=time.time() func(*args,**kwargs) #调用被装饰函数 end_time=time.time() return inner #返回内层嵌套函数 return outter #返回外层嵌套函数 @timer(timer_type=‘min‘) def foo(name,args): #定义被装饰函数 time.sleep(1) print(‘in foo‘,name,age) foo(‘woniu‘,24)
被装饰函数有返回值,遵循如下规则
import timer def timer(timer_type): #定义高阶函数为装饰器函数,带有参数 def outter(func): #定义嵌套函数,参数为被装饰函数 def inner(*args,**kwargs) #定义嵌套函数,被装饰函数有参数 start_time = time.time() res = func(*args,**kwargs) end_time = time.time() print(‘程序运行时间为‘,end_time-start_time) return res #返回被装饰函数的返回值 return inner #返回内层嵌套函数 return outter #返回外层嵌套函数 @timer(timer_type=‘min‘) def foo(name,age): #定义被装饰函数,有返回值,有多个参数 time.sleep(1) print(‘in foo‘,name,age) return name print(foo(‘woniu‘,24)) #输出被装饰函数的返回值
原文:https://www.cnblogs.com/feng1014/p/12635121.html