Python 中的装饰器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 中的装饰器相关的知识,希望对你有一定的参考价值。
说到装饰器是我们每个学Python人中的心痛。
装饰器作用:是用来装饰其他函数的,为其他函数添加新功能。
原则:1.不能改变被修饰函数的源代码。
2.不能修改被修饰函数的调用方式。
学装饰器前还需要了解的东西:
返回值(return):
return 语句是可选的,它可以定义在函数体的任意位置表示函数调用到此结束。如果没有return语句输出的是none,如果有return语句但是return后没有跟东西,也是返回的是none。
注意:(1)要想看到return后边的值,需要打印出来print(func())
(2)不需要看到return后边的值,直接调用func()。
(3)返回值中跟函数其实是跟的函数名字。
func(-10)是函数调用,得到的是函数值:包括print后的东西,和return后的东西
func 是函数对象,函数名,门牌号,得到的是内存地址。
高阶函数:1.一个函数接收另一个函数名做参数。
2.返回值中包含函数名。
补充:
嵌套函数:在一个函数里定义新的一个函数。
函数即是变量:变量就是定义后可以改变,可以重新赋值的量。
装饰器=高阶函数+嵌套函数
例子要求:1.写一个装饰器,计算两个程序运行耗时。
2.不改变源代码和调用方式。
例子:
1 # Author :ZHANG 2 #-*-coding:utf-8-*- 3 import time 4 def text1(): 5 time.sleep(3) 6 print("in the text1") 7 def text2(): 8 time.sleep(2) 9 print("in the text2")
方法:
1 # Author :ZHANG 2 #-*-coding:utf-8-*- 3 import time 4 def solu(func): 5 def wreppe(): 6 star_time=time.time() 7 func() 8 stop_time=time.time() 9 print("耗时为%s秒."%(stop_time-star_time)) 10 return wreppe 11 @solu #这里其实为:text1=solu(text1) 12 def text1(): 13 time.sleep(3) 14 print("in the text1") 15 @solu #同text1 16 def text2(): 17 time.sleep(2) 18 print("in the text2") 19 text1() #这里并不是真的text1(),其实是一个替代,solu(text1)() 20 text2() #同text1
结果:
1 in the text1 2 耗时为3.000171661376953秒. 3 in the text2 4 耗时为2.0001144409179688秒.
继续增加要求:text2加上多个参数,包括关键参数
方法:
1 # Author :ZHANG 2 #-*-coding:utf-8-*- 3 import time 4 def solu(func): 5 def wreppe(*args,**kwargs): 6 star_time=time.time() 7 func(*args,**kwargs) 8 stop_time=time.time() 9 print("耗时为%s秒."%(stop_time-star_time)) 10 return wreppe 11 @solu #这里其实为:text1=solu(text1)=wreppe 12 def text1(): 13 time.sleep(3) 14 print("in the text1") 15 @solu #同text1 16 def text2(*args,**kwargs): 17 time.sleep(2) 18 print("text2:",args,kwargs) 19 text1() #这里并不是真的text1(),其实是一个替代,solu(text1)() 20 text2(2,"we",a=1) #同text1
结果:
1 in the text1 2 耗时为3.000171661376953秒. 3 text2: (2, ‘we‘) {‘a‘: 1} 4 耗时为2.0001144409179688秒.
以上是关于Python 中的装饰器的主要内容,如果未能解决你的问题,请参考以下文章