1. 主要内容
- args和*args的区别
- 装饰器进阶
- functools wraps
- 带参数的装饰器
- 多个装饰器装饰同一个参数
2. args和*args的区别
1 | def outer(*args): |
3. functools wraps
1 | from functools import wraps |
4. 带参数的装饰器
如果有很多函数都装载了装饰器,想要取消需要一个一个的停掉,这样很麻烦。因此可以用带参数的装饰器,设置flag来解决
无参数的装饰器:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import time
def timmer(func):
def inner(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print(end - start)
return ret
return inner
def wahaha():
time.sleep(0.1)
print('wahhhh')
def erguotou():
time.sleep(0.1)
print('erguotou')
带参数的装饰器
(在装饰器函数外面又套了一个函数,利用闭包原理用外层函数向内部传递参数)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36import time
flag = False
def timmer_out(flag):
def timmer(func):
def inner(*args, **kwargs):
if flag:
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print(end - start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return timmer
# timmer = timmer_out(flag)
# @timmer
def wahaha():
time.sleep(0.1)
print('wahhhh')
def erguotou():
time.sleep(0.1)
print('erguotou')
wahaha()
erguotou()
5. 多个装饰器装饰同一个函数
由于装饰器会寻找最接近的函数,因此出现“外侧套内侧的现象”
1 | # 多个装饰器装饰一个函数 |
命令执行顺序如下:
