Python装饰器
首先提出一个问题,可以把一个函数作为另一个函数的参数传递过去嘛?答案是可以的
如下图所示:
#能不能把函数作为参数传递给另一个函数呢?
def myfunction():
print("myfunction函数正在执行......")
def myfunction1(func): #把函数作为一种参数传递给下一个函数中
print("myfunction1函数正在调用中....")
func() #调用函数
print("调用完成......")
#调用函数
myfunction1(myfunction)
#结果:
myfunction1函数正在调用中....
myfunction函数正在执行......
调用完成......
接下来我们创建一个比较复杂的函数,来计算一个函数在调用的时候经历了多长时间:
#来计算一个函数在调用的时候经历了多长时间
def timecontrol(func):
print("-------------")
time_time1 = time.time()
func()
time_time2 = time.time()
time_ = time_time2 - time_time1
print("--------------")
print("时间经历:",time_)
def myfunction2():
time.sleep(2)
print("myfunction2函数已经进行调用...")
timecontrol(myfunction2)
上面调用函数的过程中,我们的效率并不是很高的,那么有没有更好的提高效率的方法呢?有的,装饰器
我们把上面的那段代码,借用装饰器来改变一下,如下代码所示:
def timecontrol1(func):
def control():
print("-------------")
time_time1 = time.time()
func()
time_time2 = time.time()
time_ = time_time2 - time_time1
print("--------------")
print("时间经历:", time_)
return control
@timecontrol1 #语法糖
def myfunction3():
time.sleep(2)
print("myfunction2函数已经进行调用...")
myfunction3()
其中@timecontrol1是一个语法糖,分析上面的代码,我们并没有显示的调用函数timecontrol(myfunction3),但是的确调用了这个函数,这便是装饰器的魅力。
介绍一下装饰器的意义,在实际开发中我们经常会遇到各种各样的需求,因而发明了装饰器,有了装饰器就可以不直接去修改代码,只用在需要调用函数的上方加上@timecontrol1就直接可以调用了。
装饰器的原理就是:1.闭包,2.拿函数当参数。装饰器的底层原理代码是这样的;
def control1(func):
def control():
print("-------------")
time_time1 = time.time()
func()
time_time2 = time.time()
time_ = time_time2 - time_time1
print("--------------")
print("时间经历:", time_)
return control
def myfunction4():
time.sleep(2)
print("myfunction4函数已经进行调用...")
myfunction4 = control1(myfunction4())
我们可以理解成语法糖的作用就是对原生代码的简单封装