Python3-装饰器

一、介绍
    装饰器本质上是一个函数,可以让其他函数在不改变源代码的前提下增加额外的功能
 
二、示例:
    ---->万能装饰器
 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次运算
----校验结束!----
 
原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/12997239.html