- 相关参考
什么是装饰器?装饰器可以用来干什么?相信不少Python开发者都遇到过这样的问题,你可以通过这篇来寻找答案!
先看以下程序:
# 判断是否是质数 def 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 # 输出质数 def prime_nums(): for i in range(2,10000): if is_prime(i): print(i) prime_nums()
这是一个判断质数的程序,我们导入time包,来看看这段程序的运行时间
import time
# 判断是否是质数
def 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
# 输出质数
def prime_nums():
# start_time:开始运行时间
start_time = time.time()
for i in range(2,10000):
if is_prime(i):
print(i)
# end_time:运行结束时间
end_time = time.time()
# 输出总运行时间
print('总运行时间:{}秒'.format(end_time - start_time))
prime_nums()
可以看到,在程序运行的最后,输出了总的运行时间,但是纵观整段代码,判断运行时间的部分与程序主要功能部分混杂在一起,显得很不直观明了,因此这里我们介绍一下装饰器的写法:
import time
def display_time(func):
"""
:param func:装饰器下方的方法
:return: wrapper,返回装饰器wrapper方法
"""
# 装饰器
def wrapper():
# start_time:开始运行时间
start_time = time.time()
func()
# end_time:运行结束时间
end_time = time.time()
# 输出总运行时间
print('总运行时间:{}秒'.format(end_time - start_time))
return wrapper
# 判断是否是质数
def 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
@display_time
def prime_nums():
for i in range(2,10000):
if is_prime(i):
print(i)
# 此时由于prime_nums()函数上面有个装饰器,因此这里是直接运行装饰器display_time(),而不是运行这个函数prime_nums()
prime_nums()
运行之后可以看到和刚才的结果是一样的,但是整体代码显得更加条理清晰。
那如果这个时候我们的函数有返回值怎么办?可参考如下:
import time
def display_time(func):
"""
:param func: 装饰器下方的方法
:return: wrapper() 返回装饰器wrapper方法
"""
# 装饰器
def wrapper():
# start_time:开始运行时间
start_time = time.time()
result = func() # 如果有返回值的话这里要注意赋值
# end_time:运行结束时间
end_time = time.time()
# 输出总运行时间
print('总运行时间:{}秒'.format(end_time - start_time))
return result # 返回值
return wrapper
# 判断是否是质数
def 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
@display_time
def prime_nums():
count = 0
for i in range(2,10000):
if is_prime(i):
print(i)
count += 1
return count
# 此时由于prime_nums()函数上面有个装饰器,因此这里是直接运行装饰器display_time(),而不是运行这个函数prime_nums()
count = prime_nums()
print(count)
那如果我们的函数带参数呢?可参考如下:
import time
def display_time(func):
"""
:param func: 装饰器下方的方法
:return: wrapper() 返回装饰器wrapper方法
"""
# 装饰器
def wrapper(*args): # 当函数带参数时,且你不知道带多少个参数,可以用*args表示参数
# start_time:开始运行时间
start_time = time.time()
result = func(*args) # 如果有返回值的话这里要注意赋值
# end_time:运行结束时间
end_time = time.time()
# 输出总运行时间
print('总运行时间:{:.4}秒'.format(end_time - start_time))
return result # 返回值
return wrapper
# 判断是否是质数
def 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
@display_time
def prime_nums(maxnum):
count = 0
for i in range(2,maxnum):
if is_prime(i):
print(i)
count += 1
return count
# 此时由于prime_nums()函数上面有个装饰器,因此这里是直接运行装饰器display_time(),而不是运行这个函数prime_nums()
count = prime_nums(10000)
print(count)
简单来说,装饰器就是一个可以让你的Python代码看起来更加清晰明了的东西,方便你的阅读,方便你的理解!
相关参考Python小技巧:装饰器(Decorator):https://www.bilibili.com/video/BV11s411V7Dt?spm_id_from=333.1007.top_right_bar_window_history.content.click



