一、装饰器
1.基本构造器
装饰器:
1.不改变原函数
2.把原函数作为一个参数,传给装饰器,返回一个新函数
目的:
1.在不改变原函数的情况下,对原函数添加新的功能
2.代码示例
import time
def time_cost(func):
def time_cost_cal():
start = time.time()
func()
end = time.time()
gap = end - start
print("it costs", gap, "time")
return time_cost_cal
@time_cost
def func():
print("start")
time.sleep(1)
print("end")
if __name__ == '__main__':
func()
3. 带有未知参数的装饰器
#带有不定参数的装饰器
import time
def deco(func):
def wrapper(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
@deco
def func2(a,b,c):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b+c))
if __name__ == '__main__':
f = func
func2(3,4,5)
f(3,4)
#func()
注意:python cook——数据结构里面提及过, *args是元组,args是列表
args = argument ,kwargs = keyword arguments关键字参数
**kwargs返回的是字典
*args返回的是数组
4.多个装饰器
import time
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
if __name__ == '__main__':
func(3,4)
#func()
走一遍数据流:
@deco1 -> print("this is deco01") ->func(*args, **kwargs) ->print("this is deco02")
-> func(*args, **kwargs) ->执行func -> 继续执行deco02 -> 继续执行deco01