装饰器(Decorator)

装饰器本质是个函数,用来给别的函数增加功能

装饰器可以在代码运行期间动态地增加函数的功能

想要给多个函数增加相同的功能,一个一个地修改效率很低而且可读性差,所以采用装饰器

基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def 装饰器名(被装饰函数):  # 装饰器
def 内容函数名(如果被装饰函数有参数那么输入 *args ): # 运行的内容 *args是执行的其他函数所带的参数(多少都行),如果没带可以留空
XX内容
XX内容
被装饰函数(如果被装饰函数有参数那么输入 *args )

# 如果被装饰函数中含有reture则需要返回被装饰函数
# 没有则不需要

return 内容函数名

@装饰器名
def 被装饰函数():
内容



直接调用被装饰函数就行


例子

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
36
37
38
39
40
# 判断是否是质数
import time # 导个时间模块


def decor1(func): # 求总时间的装饰器
def con(*args): # 运行的内容 *args多个或单个参数
t1 = time.time()
fun2_c = func(*args) # 执行传入的函数, 并把函数结果赋值给fun2_c
t2 = time.time()
print("run time: {:.2} s".format(t2 - t1)) # 输出美化 .format格式化函数{内容} {:.2} 保留两位小数
return fun2_c
return con


def fun1(num): # 判断是否为质数的方法,测试用的
if num < 2:
return False
elif num == 2:
return True
else:
for i in range(2, num):
if num % i == 0:
return False
return True


@decor1
def fun2(maxnum):
count = 0
for i in range(2, maxnum):
if fun1(i):
count = count + 1

return count


print(fun2(10000))

# fun2() # 当运行这个函数的时候会自动跳到装饰器并将fun2传入参数执行

参考资料:

python小技巧:装饰器(Decorator)

详解Python迭代器,生成器,装饰器