一、装饰器是什么?
python的装饰器就是一种拓展被装饰函数功能的一种函数,它的目的在于不改变被装饰函数的源代码和调用方式的情况下增加新的功能。
举个例子
你的手机只有打接电话,发短信的功能,某天,你要给你的手机增加新的功能,比如上网,即其他功能不变,单纯增加上网这一个功能
二、用法
1.不带参数的函数装饰器
代码如下(示例):
1. def funa(f): #将函数f作为参数 ① 2. def funb(): #定义内部函数funb ③ 3. print("hello") 4. f() #调用函数f ④ 5. print("china") 6. return funb #返回一个函数funb ② 7. 8. @funa 9. def fund(): 10. print("你好,中国") 11. fund() 12. #outputs:hello 13. # 你好,中国 14. # china
以下装饰器写法完全等价于右边
1. 2. @funa <==> fund=funa(fund) 3. def fund() : fund() 4. print("你好,中国") 5. fund()
运行流程示意如下
2.带参数的函数装饰器
代码如下(示例):
1. import time 2. 3. def timeit(iteration): 4. def inner(f): 5. def wrapper(*args,**kwargs): 6. start=time.time() 7. for i in range(iteration): 8. ret=f(*args,**kwargs) #*args,**kwargs 不定长参数,可写入多个参数 9. print(time.time()-start) 10. return ret 11. return wrapper 12. return inner 13. 14. @timeit(3) 15. def double(x): 16. return x*2 17. double(1) 18. # outputs:3.0994415283203125e-06
注意:这种写法是先计算装饰器里的参数,然后把double(1)传入函数timeit中,并最终返回结果显示
@timeit(3)
def double(x):
return x*2
double(1)
等价于
double=timeit(3)(double)
doubel(1)
运行流程示意如下