关于在Python中杀死开关

时间:2013-09-10 20:16:22

标签: python serial-port switch-statement

我正在处理python中串口的数据。第一个字节表示消息的开始,然后第二个字节表示它是什么类型的消息。根据我们在消息中读取的第二个字节不同(为了考虑不同类型的消息,有些只是其他数据是字符串等等)。

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

在我的read_value_from_serial中,我读入了所有字节。现在我使用下面的代码(这是不好的)来确定消息是一个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]()

现在我想简化/改进这种类型的代码。我已经阅读了关于杀死交换机但我不喜欢我必须创建最终不会使用的对象。有任何改善这个具体问题的建议吗?

由于

1 个答案:

答案 0 :(得分:2)

这与你所拥有的非常接近,我认为没有任何问题。

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)

你说"我不喜欢我必须创造我最终不会使用的物品"。你怎么没有使用这些物品?如果我有一个StringMessage msg,那么

msg.print()

正在使用一个对象应该如何使用它。您的msg_string只有一个msg_string.read()实例只能调用{{1}},这让您感到困扰吗?我的示例代码为每个读取的消息创建一个新的Message实例;那是什么对象。这实际上是面向对象编程的工作原理。