装饰器提高代码复用,减少代码量
对于一个程序程序,无论是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