python装饰器
装饰器
增强某一函数的功能,但是又不希望修改原函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。代码需要遵循开放封闭原则,已经实现的功能代码不允许被修改,但可以扩展。
比如先写一个判断质数的函数(该数除了1和它本身以外不再有其他的因数)
1
2
3
4
5
6
7
8
9
10def is_prime(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定义一个函数,输出区间范围的质数
1
2
3
4
5def prime_nums():
for i in range(2,100):
if is_prime(i):
print(i,end=",")
prime_nums()输出结果为
1
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
我们想计算一下找出质数用了多长时间,我们可以这样(尽量参数大一些)
1
2
3
4
5
6
7
8def prime_nums():
t1 = time.time()
for i in range(2,10000):
if is_prime(i):
print(i)
t2 = time.time()
print(t2 - t1)
prime_nums()输出结果为
1
2
3
4
5
6...
9941
9949
9967
9973
0.28626275062561035那么我想要用装饰器去算出时间,首先先写装饰器,并加到函数上面运行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#装饰器的书写
def date_time(func):
def wrapper(*args):
t1 = time.time()
func(*args)
t2 = time.time()
print(t2 - t1)
return wrapper
#将装饰器添加到应用函数当中
def prime_nums(nums):
for i in range(2, nums):
if is_prime(i):
print(i)
prime_nums(10000)执行结果
1
2
3
4
5
6...
9941
9949
9967
9973
0.2872016429901123从上述函数所得到装饰器的作用非常的方便,那么如果应用函数return一个值的时候,这样的装饰器需要再做小小的改动,将返回值传到装饰器中,才可使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#装饰器
def date_time(func):
def wrapper(*args):
t1 = time.time()
result = func(*args)
t2 = time.time()
print(t2 - t1)
return result
return wrapper
#返回质数的个数和
def prime_nums(nums):
count = 0
for i in range(2, nums):
if is_prime(i):
count = count + 1
return count
count = prime_nums(10000)
print(count)执行结果
1
20.28022122383117676
1229这样子我们就能看到装饰器当中也要传值,并且返回函数的值,才能在最后的结果中显示。
更好的展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19def date_time(func):
def wrapper(*args):
t1 = time.time()
result = func(*args)
t2 = time.time()
print("time: {:.4} s".format(t2 - t1))
return result
return wrapper
def prime_nums(nums):
count = 0
for i in range(2, nums):
if is_prime(i):
count = count + 1
return count
count = prime_nums(10000)
print("质数的个数:%s"%count)执行结果
1
2time: 0.2793 s
质数的个数:1229