一、 什么是装饰器:
器即函数;
装饰即修饰,意指为其他函数添加新功能。
装饰器定义:本质就是函数,功能是为其他函数添加新功能。
二、装饰器需要遵循的原则:
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的结果
不用计时