一、 什么是装饰器:
器即函数;
装饰即修饰,意指为其他函数添加新功能。
装饰器定义:本质就是函数,功能是为其他函数添加新功能。
二、装饰器需要遵循的原则:
1.不修改被装饰函数的源代码(开放封闭原则);
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。
三、无参装饰器:
不用传参数来使用装饰器。
以下的操作是为函数foo来增加新的计时功能:不改变原函数的代码和调用方式
import time #调用time模块 def timmer(func): #装饰器timmer,将函数foo的函数名为参数传给timmer def wrapper():#嵌套函数 start_time = time.time()#开始时间 func() #func=函数foo 加括号函数直接被调用 stop_time = time.time() #结束时间 print("函数运行的时间是%s"%(stop_time-start_time)) return wrapper #返回wrapperde @timmer #装饰器的语法@+装饰器名,foo = timmer(foo) def foo(): #定义的一个无参函数 time.sleep(2) #使程序睡眠2s print("welcome to beijing") foo() #调用foo函数 ---------------------以下是输出结果---------------------- welcome to beijing 函数运行的时间是2.0
四、有参装饰器:
要传参数来使用装饰器。
以下的操作是为函数my_max来增加新的计时功能,通过装饰器传的参数判断,执行对应的代码,实现相应的功能:
不改变原函数的代码和调用方式。
import time # 调用time模块 #定义装饰器阶段 def choice(x=1): #通过装饰器传的参数(默认为1),完成下面的判断,达到自己想要的状态 def timmer(func): # 嵌套函数 def wrapper(*args, **kwargs): # 接收参数 if x == 1: #当装饰器传的参数是1时,就启用计时功能 start_time = time.time() # 开始计时 func(*args, **kwargs) # func=函数my_max 加括号来调用函数 stop_time = time.time() # 结束计时 print("函数的运行时间是%s" % (stop_time - start_time)) elif x == 0: #当装饰器传的参数是0时,就不启用计时功能 func(*args, **kwargs) # func=函数my_max 加括号来调用函数 print("不用计时") return wrapper # 返回wrapper return timmer #返回timmer #调用装饰器 @choice()#要加括号传参数运行函数的 #@timmer my_max=timmer(my_max)#为my_max这个函数增加计时功能 def my_max(x, y): # 比较两个数的大小 time.sleep(2) # 睡眠2s,方便实验效果 res = x if x > y else y # 判断x与y的大小 print("from the my_max,the max is %s" % res) #调用函数阶段 my_max(1, 2) # 调用函数并按位置传参 -----------------------输出结果---------------------- from the my_max,the max is 2 #这是使用的默认参数的结果 函数的运行时间是2.0 #当@choice(0) 时 -----------------------输出结果---------------------- from the my_max,the max is 2 #choice传的参数是0的结果 不用计时