栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

真正的理解Python的装饰器(Decorator)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

真正的理解Python的装饰器(Decorator)

真正的理解Python的装饰器(Decorator)
  • 相关参考

什么是装饰器?装饰器可以用来干什么?相信不少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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号