学习笔记|decorator 装饰器是什么?
学习链接:https://www.bilibili.com/video/BV1Gu411Q7JV/
文章目录
- 1. 函数
- 1.1 函数是一个对象
- 1.2 函数可以被当成参数传进其他函数里
- 1.3 函数可以被当作一个返回值
- 2. decorator (装饰器)
- 2.1 decorator is callable (可调用的),可以理解为decorator本身是一个函数,@后面跟的是一个函数名
- 2.2 decorator 输入是函数,输出不一定是函数
- 2.3 例1:decorator 用在一个参数
- 2.4 例2
- 2.5 例3: decorator 用在多个参数——*args, **kwargs 参数
- 2.6 带参数的 decorator
- 2.7 例4: 带参数的 decorator
1. 函数
1.1 函数是一个对象
新建变量,变量里保存一个函数对象
1.2 函数可以被当成参数传进其他函数里
1.3 函数可以被当作一个返回值
2. decorator (装饰器)
2.1 decorator is callable (可调用的),可以理解为decorator本身是一个函数,@后面跟的是一个函数名
2.2 decorator 输入是函数,输出不一定是函数
2.3 例1:decorator 用在一个参数
思路:
my_func(1)
= timeit( myfunc ) (1)
= wrapper(1)
= {start = time.time(); ret = myfunc(1); print(time.time() - start); return ret}
= {print(time.time() - start); return myfunc(1)}
= 计算时间 (myfunc(1) 没有 print 所以不显示数值)
2.4 例2
思路:
other_func(2)
=timeit(other_func)(2)
= {start=time.time(); ret=other_func(2); print(time.time()-start); return ret}
= {4+计算时间; return other_func(2)}
print(other_func(2))
= {计算时间; return other_func(2)=2*2=4}
={{计算时间; 4}
2.5 例3: decorator 用在多个参数——*args, **kwargs 参数
思路:
add(2,3)
=timeit(add)(2,3)
= wrapper(2,3)
= {start=time.time(); ret=add(2,3)=2+3=5; print(time.time()-start); return ret}
= {计算时间; add(2,3)}
print(add(2,3))
={计算时间; add(2,3)=2+3=5}
={计算时间; 5}
2.6 带参数的 decorator
2.7 例4: 带参数的 decorator
思路:
第17行:
@timeit(1000) def double(x): return x*2
= @inner def double(x): return x*2
第21行:
double(2)=inner(double)(2)
= wrapper(2)
= {start=time.time(); for _ in range(1000): ret=double(2);print(time.time()-start); return ret}
= {print(time.time()-start); return double(2)}
= 计算时间 (ret 没有打印,所以没有出现)