一、介绍
装饰器本质上是一个函数,可以让其他函数在不改变源代码的前提下增加额外的功能
二、示例:
---->万能装饰器
1 import time
2
3 def decorate(func):
4 def inner_func(*args,**kwargs):
5 print("---校验开始---")
6 time.sleep(2)
7 func(*args,**kwargs)
8 print("---校验结束---")
9 return inner_func
10
11 @decorate
12 def f1():
13 print("------------->sakura")
14
15 f1()
16
17 @decorate
18 def f2(num):
19 for i in range(num):
20 print("第{}次打印".format(i))
21
22 f2(3)
23
24 student = ["Sakura","Seele","Annie"]
25 @decorate
26 def f3(l,clazz = "1903"):
27 print("{}班级学生名单有:".format(clazz))
28 for i in l:
29 print(i)
30
31 f3(student,clazz="1905")
结果:
---校验开始---
------------->sakura
---校验结束---
---校验开始---
第0次打印
第1次打印
第2次打印
---校验结束---
---校验开始---
1905班级学生名单有:
Sakura
Seele
Annie
---校验结束---
三、多重装饰器
如果装饰器是多重的,谁距离函数最近,就优先使用哪个装饰器
示例:
1 import time
2
3 def decorate(func):
4 print("----Start 01----")
5 def wrapper(*args,**kwargs):
6 print("----装饰器01 校验开始!----")
7 time.sleep(1)
8 func(*args,**kwargs)
9 print("----装饰器01 校验结束!----")
10 print("----End 01----")
11 return wrapper
12
13 def decorate1(func):
14 print("----Start 02----")
15 def wrapper(*args,**kwargs):
16 print("----装饰器02 校验开始!----")
17 time.sleep(1)
18 func(*args,**kwargs)
19 print("----装饰器02 校验结束!----")
20 print("----End 02----")
21 return wrapper
22
23 @decorate1
24 @decorate
25 def func():
26 for i in range(5):
27 time.sleep(1)
28 print("第{}次打印!".format(i))
29
30 func()
结果:
----Start 01----
----End 01----
----Start 02----
----End 02----
----装饰器02 校验开始!----
----装饰器01 校验开始!----
第0次打印!
第1次打印!
第2次打印!
第3次打印!
第4次打印!
----装饰器01 校验结束!----
----装饰器02 校验结束!----
四、装饰器带参数
带参数的装饰器是三层的
最外面的函数负责接收装饰器参数
里面的内容还是原装饰器的内容
示例:
1 import time
2 def decorate(a): # 1.接收装饰器的参数
3 def inner_decorate(func): # 2.接收函数
4 def wrapper(*args,**kwargs): #3.接收函数中的参数
5 time.sleep(1)
6 print("-----校验开始!----")
7 func(*args,**kwargs)
8 print("进行了{}次运算".format(a))
9 print("----校验结束!----")
10 return wrapper
11 return inner_decorate
12
13
14 @decorate(a=10)
15 def func(num1):
16 for i in range(0,num1):
17 print("第{}次打印!".format(i))
18
19 func(5)
结果:
-----校验开始!----
第0次打印!
第1次打印!
第2次打印!
第3次打印!
第4次打印!
进行了10次运算
----校验结束!----