装饰器

Posted gumpyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

1.装饰器的特点:
1.函数A作为参数出现的(函数B就接收函数A作为参数)
2.要有闭包的特点
 1 """
 2 装饰器的特点:
 3     1.函数A作为参数出现的(函数B就接收函数A作为参数)
 4     2.要有闭包的特点
 5 """
 6 
 7 
 8 # 可以将函数作为参数传进另一个函数里面去
 9 def funcA():
10     print("----->test")
11 
12 
13 def funcB(f):
14     print(f)
15     f()
16     print("------->func")
17 
18 
19 funcB(funcA)

技术图片

 

2.装饰器加入可变参数和关键字

 1 import time
 2 
 3 
 4 def decorate(func):
 5     def wrapper(*args, **kwargs):   # {"clazz":‘1904‘}
 6         print("正在校验中.....")
 7         time.sleep(2)
 8         print("校验完毕.....")
 9         # 调用原函数
10         func(*args, **kwargs)
11 
12     return wrapper
13 
14 
15 @decorate
16 def f1(n):
17     print("----f1-----", n)
18 
19 
20 @decorate
21 def f2(name, age):
22     print("-----f2-----", name, age)
23 
24 
25 @decorate
26 def f3(students, clazz=1905):
27     print("{}班级的学生如下:".format(clazz))
28     for stu in students:
29         print(stu)
30 
31 
32 
33 f1(5)
34 f2("tom", 20)
35 students = ["ketty", "tony", "rose"]
36 f3(students, clazz=1904)

技术图片

 

3.多层装饰器

如果装饰器是多层的,谁距离函数最近,就优先使用那个
 1 """
 2 如果装饰器是多层的,谁距离函数最近,就优先使用那个
 3 """
 4 
 5 
 6 def decorate1(func):
 7     print("--------> 1 start")
 8 
 9     def wrapper(*args, **kwargs):
10         func()
11         print("刷漆")
12     print("---------> 1 end")
13 
14     return wrapper
15 
16 
17 def decorate2(func):
18     print("--------> 2 start")
19 
20     def wrapper(*args, **kwargs):
21         func()
22         print("铺地板")
23 
24     print("------------> 2 end")
25 
26     return wrapper
27 
28 
29 @decorate2
30 @decorate1
31 def house():
32     print("我是毛坯房")
33 
34 
35 house()

技术图片

原理:

 技术图片

 def定义一个函数,只是在内存中开辟空间,给出地址,并没有执行

只有调用函数的时候,才去根据地址,进入执行

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例类装饰器(装饰函数)

装饰器、装饰器类与类装饰器(三)

Python进阶装饰器(Decorator)

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

TS之装饰器