首页 > 编程语言 >python装饰器提高代码复用,减少代码量,简洁易懂

python装饰器提高代码复用,减少代码量,简洁易懂

时间:2024-08-07 17:49:36浏览次数:12  
标签:python 代码 len HEADER command frame 易懂 data FRAME

装饰器提高代码复用,减少代码量

对于一个程序程序,无论是c、java、go还是python,组成这段程序的代码需要越简单越好,要知道程序的代码越简单,代码量越少,出错的概率就小,维护起来也简单。针对python语言,装饰器是我最近发现的针对简化代码,特别有帮助的工具。下面我用两段代码,演示一下同样一个程序,使用装饰器的代码,对比没有装饰器的代码在简洁性、容易阅读,以及后期的修改,变得更好了。

没使用装饰器的样子。

#创建任务的函数
def creat_task_frame():
	FRAME_HEADER = 68
	FRAME_TAIL = 5F5F656E645F5F
	#命令字节
	command = 0000
	#数据字节
	data = b"\x00\x00\x00"
	total_frame_length = len(FRAME_HEADER) + 4 + len(command) + len(_and_data) + len(FRAME_TAIL)
	_f = FRAME_HEADER + length + command_and_data + FRAME_TAIL
    return _f
#取消任务的函数
def cancel_task_frame():
	FRAME_HEADER = 68
	FRAME_TAIL = 5F5F656E645F5F
	#命令字节
	command = 0001
	#数据字节
	data = b"\x01\x00\x01" 
	total_frame_length = len(FRAME_HEADER) + 4 + len(command) + len(_and_data) + len(FRAME_TAIL)
	_f = FRAME_HEADER + length + command_and_data + FRAME_TAIL
    return _f
 #暂停任务的函数
 def stop_task_frame():
	FRAME_HEADER = 68
	FRAME_TAIL = 5F5F656E645F5F
	#命令字节
	command = 0002
	#数据字节
	data = b"\x02\x00\x02" 
	total_frame_length = len(FRAME_HEADER) + 4 + len(command) + len(_and_data) + len(FRAME_TAIL)
	_f = FRAME_HEADER + length + command_and_data + FRAME_TAIL
    return _f
	

仔细观察三个函数,你会发先每个函数都有个共同点,就是里面FRAME_HEADER 、FRAME_TAIL、total_frame_length都是相同的。那样有没有什么方法每次创建函数时,不重复再写一遍FRAME_HEADER 、FRAME_TAIL、total_frame_length。

所以下面我们用装饰器来优化,通过装饰器struct_frame构建重复的代码,然后@struct_frame去运用。

def struct_frame(fun):
    def frame(*args, **kwargs):
        command_and_data = fun(*args, **kwargs)
        FRAME_HEADER = 68
		FRAME_TAIL = 5F5F656E645F5F
        total_frame_length = len(FRAME_HEADER) + 4 + len(command_and_data) + len(FRAME_TAIL)
        length = struct.pack('<I', total_frame_length)
        _f = FRAME_HEADER + length + command_and_data + FRAME_TAIL
        return _f
    return frame
    
 #创建任务的函数
 @struct_frame
def creat_task_frame():
	#命令字节
	command = 0000
	#数据字节
	data = b"\x00\x00\x00"
	command_and_data = command + data
    return command_and_data

#取消任务的函数
 @struct_frame
def cancel_task_frame():
		#命令字节
	command = 0002
	#数据字节
	data = b"\x02\x00\x02" 
	command_and_data = command + data
    return command_and_data
 #暂停任务的函数
 def stop_task_frame():
 		#命令字节
	command = 0002
	#数据字节
	data = b"\x02\x00\x02" 
	command_and_data = command + data
    return command_and_data
 	

回过头对比看这两段代码,在简洁性、容易阅读,以及后期的修改,是不是变得更好了?如果你觉得第一种方法更好,那是因为你还没需要大面积修改的情况。如果FRAME_HEADER从68变成了69,对于第一种方法,creat_task_frame、cancel_task_frame、stop_task_frame需要修改三次这个“FRAME_HEADER”参数,这时候你可能也不觉得麻烦。毕竟才修改三次。但是如果有100个函数,甚至10000个函数,那就意味着你就要修改100次,10000次。你现在再想想,会觉得第一种代码更好了吗?

另外,使用第二种方法1还有一个好处。现在假如现在领导要求你再添加一个start_task_frame函数,对于第一中方法,我们需要关注FRAME_HEADER、FRAME_TAIL、command、data、total_frame_length、_f 6个元素。而使用第二种方法只需要关注command 、data、command_and_data(这个还是command+data,事实上我们只用关注两个元素)。这对于你要添加新的函数时,是不是也变得更加简单了?

实际上,在你的项目上可能更复杂,我想说的是恰到好处地使用装饰器,能帮你省去大量的麻烦。

标签:python,代码,len,HEADER,command,frame,易懂,data,FRAME
From: https://www.cnblogs.com/hengchen/p/18347555

相关文章

  • python,怎么用工厂模式设计代码?
    工厂模式打造工厂模式,需要抽象工厂和具体工厂。怎么理解?抽象工厂就是接口的定义,但不负责具体的实现。而具体工厂则需要负责定义的接口的实现。就好比你爸爸让你上街时带一瓶酱油,而具体买什么牌子的由你决定。”你爸爸让带一瓶酱油“就是接口的定义函数,这个函数只负责定义”要求“......
  • python-深拷贝和浅拷贝
     浅拷贝list_name=["李琪",["周义杰","毛绍祺"]]data01=list_name[:]#触发浅拷贝:只复制第一层,共享深层数据data01[0]="琪琪"#修改第一层,数据2份,互不影响data01[1][0]="义杰"#修改深层,数据1份,数据互相影响print(list_name)print(data01) 深拷贝 作用:互不......
  • 【C++】一文带你学完 C++【完整版-附代码示例】
    本文篇幅较长,几乎涵盖了权威C语言教程【CppPrimerPlus】的所有可用知识点,建议点赞收藏关注方便后续阅读。附注:建议学完一个知识点后,同步进行编程练习以便于巩固掌握知识点;编程学习是重理论更重实践的一个过程,唯有多写多练才能快速掌握C++全教程正文开始......
  • 大学之前没接触过代码?别慌,接下这泼天的安利吧
    编程小白如何成为大神?老学长亲身安利随着科技产品不断渗透各行各业,编程已成了所有专业的通识课,哪怕是学医,学法,甚至是学语言,看似毫无关联的背后,编程语言都发挥着各自的作用。类似的重要性网上一大堆,笔者不是营销号就不再赘述。但面对网上众多编程语言和学习资源,新生们,哪怕是过......
  • Python 循环引用与内存泄漏:深度解析
    Python循环引用与内存泄漏:深度解析在Python编程中,循环引用和内存泄漏是两个需要特别注意的问题。本文将深入探讨Python中的循环引用现象、其导致的内存泄漏问题,并提供详细的解决思路与方法。同时,我们还将分析一些常见场景,并分享扩展与高级技巧,帮助读者全面理解和应对这一......
  • GitHub点赞飙升!电信大牛的Python渗透测试实战指南
    在网络安全领域,会不会编程,是区分“脚本小子”和真正黑客的关键。实际的渗透测试中会遇到各种复杂的网络环境,常用工具不一定能满足需求,这时就需要对现有工具进行扩展,或者编写符合要求的工具、自动化脚本,这都需要一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制脚本......
  • 腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发
    腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发......
  • Python scipy.optimize 给出错误答案,如何处理半定正条件?
    目标是使用pythonscipy.optimize计算优化问题。假设C是给定的4维矩阵(在代码中我使用随机矩阵来表示)。优化后的变量为A0和B0,它们是二维对称矩阵。约束条件是I+A0、I-A0、I+B0、I-B0是半定正的,其中I是二维单位矩阵。目标函数为maxTr((A0⊗B0)C),其中⊗是克罗内克......
  • python+flask计算机毕业设计智慧养老系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,智慧养老成为了社会关注的焦点。传统的养老模式已难以满足老年人日益增长的多元化需求,而智慧养老系......
  • 由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果
    我正在尝试获取餐厅的链接,但我只能获取前30家餐厅的链接,而无法获取所有其他餐厅的链接。马德里地区的餐馆有数百家,分页每页只显示30家,以下代码只获取这30家importreimportrequestsfromopenpyxlimportWorkbookfrombs4importBeautifulSoupasbcity_name='......