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

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

对于一个程序程序,无论是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,事实上我们只用关注两个元素)。这对于你要添加新的函数时,是不是也变得更加简单了?

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

posted @ 2024-08-07 17:50  李衡臣  阅读(30)  评论(0)    收藏  举报