关于终止Python中的开关

2024-09-25 00:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python处理串行端口的数据。第一个字节表示消息的开头,然后第二个字节表示消息的类型。根据第二个字节,我们以不同的方式读入消息(为了解释不同类型的消息,有些只是数据,有些是字符串等等)。在

我现在有了以下结构。我有一个通用的消息类,它包含每种类型消息的基本函数,然后派生类表示不同类型的消息(例如DataMessage或StringMessage)。这些都有自己特定的读取和打印功能。在

在我从序列号读取的值中,我读取了所有字节。现在,我使用以下代码(这是错误的)来确定消息是DataMessage还是StringMessage(大约有6种不同类型的消息,但我简化了一点)。在

msg_type = serial_port.read(size=1).encode("hex").upper()
msg_string = StringMessage()
msg_data = StringData()

processread = {"01" : msg_string.read, "02" : msg_data.read}
result = processread[msg_type]()

现在我想简化/改进这类代码。我读过关于关闭开关的文章,但我不喜欢我必须创建最终不会使用的对象。有什么改进这个具体问题的建议吗?在

谢谢


Tags: 数据端口代码消息类型readdatastring
1条回答
网友
1楼 · 发布于 2024-09-25 00:28:30

这很接近你所拥有的,我看不出有什么问题。在

class Message(object):
    def print(self):
        pass

class StringMessage(Message):
    def __init__(self, port):
        self.message = 'get a string from port'

def MessageFactory(port):
    readers = {'01': StringMessage, … }
    msg_type = serial_port.read(size=1).encode("hex").upper()
    return readers[msg_type](port)

你说“我不喜欢我必须创建最终不会使用的对象”。你怎么不使用这些对象?如果我有一个StringMessagemsg,那么

^{pr2}$

使用一个对象正是它应该如何使用的。您的一个msg_string实例只存在于调用msg_string.read()时,这是否让您感到困扰?我的示例代码为每次读取的消息创建一个新的消息实例;这就是对象的用途。这就是面向对象编程的工作原理。在

相关问题 更多 >