装饰器:本质就是函数,功能是为其他函数添加附加功能
原则:
1、不修改被修饰函数的源代码
2、不修改被修饰函数的调用方式
##########
装饰器 = 高阶函数 + 函数嵌套 + 闭包
高阶函数:
1、函数的参数包含一个函数名
2、函数的返回值包含一个函数名
3、满足上面任意条件,都可称为高阶函数
解压序列:
a,b,c = [1,2,3] #不能多也不能少,一一对应
a,b,c = "hel"
a, *_, c = [1,2,3,4,5,6,7,32,43,7,9] #_接收a和c之间的元素
a = 1
b = 2
a, b = b, a #交换
装饰器示例:
##################不带参数装饰器
给适应带有参数的不同函数:
import time
def timer(func):
def wrapper(*args, **kwargs): #修饰的函数参数不固定
start_time = time.time()
res = func(*args, **kwargs) #记录传入函数的返回值
stop_time = time.time()
print("运行的时间是 %s" % (stop_time - start_time))
return res #返回传入参数的返回值
return wrapper #函数嵌套,避免重复运行
@timer #test = timer(test)
def test(name, age, z = None):
time.sleep(1)
print("test函数运行完毕 name = %s age = %d, z = %s" % (name, age, z))
return "这是test的返回值"
res = test("Q", 18) #就是在运行wrapper
res = test("Q", 18, z = "H")
print(res)
####################闭包带参数装饰器####
给装饰器加参数:
import time
def timer_para(para = None): #给装饰器附加参数
def timer(func):
def wrapper(*args, **kwargs): #修饰的函数参数不固定
print("%s, 可以使用我做骚操作啦" % para)
start_time = time.time()
res = func(*args, **kwargs) #记录传入函数的返回值
stop_time = time.time()
print("运行的时间是 %s" % (stop_time - start_time))
return res #返回传入参数的返回值
return wrapper #函数嵌套,避免重复运行
return timer
@timer_para("我是装饰器参数") #timer = timer_para(para) ===>> @timer 附加了参数para ===》》 test = timer(test)
def test(name, age, z = None):
time.sleep(1)
print("test函数运行完毕 name = %s age = %d, z = %s" % (name, age, z))
return "这是test的返回值"
res = test("Q", 18) #就是在运行wrapper
res = test("Q", 18, z = "H")
print(res)
06-19
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交