OOP:与另一个类的多个实例共享一个类(硬件端口)的实例(过滤器)

时间:2017-06-08 20:20:22

标签: python oop

我有一个程序(用户界面)来收集来自5个不同节点的数据,并对接收到的数据执行过滤(移动平均,winsormean,模式和许多其他过滤器)。整个程序使用3个类

设计
  • Class#1:SerialComm类提供读写方法 只有一个串口,所有节点都是物理连接的。

  • Class#2:StatusBar类提供更新用户的状态栏 接口(错误消息,确认密钥的用户操作 印刷中)。

  • 第3课:Node类保存5个节点中每个节点的数据 通过串行接口收集的数据使用各种后处理 过滤技术。

串行端口可以有一个实例,但每个节点实例都需要将此实例用于get_data()。同样地,StatusBar也只有一个,目前我正在将SerialCommStatusBar的实例传递给5个节点的每个实例,如下所示。

我不喜欢这种将实例传递给每个对象的方法,有没有更好的方法来处理它?<​​/ strong>

class StatusBar:

   def __init__(self):
      self.status_message = 'none'

   def get_status_msg(self):
      return self.status_message

   def update_status_msg(self, msg):
      self.status_message = msg


class SerialComm:
   def __init__(self, portnum, obj_statusbar, baud=19200):

     # More code follows

     self._portNumber = portnum
     self.statusMsg = obj_statusbar

     try:
        self._portInstance = serial.Serial(self._portNumber,baud, timeout=0.05)
     except IOError, e:
        print e

   def write_bytes(self,len):
     # Write method
   def read_bytes(self,len):
     # read method

class Node:
   def __init__(self,obj_statusbar, obj_comm, n_address, n_location=0, ref_rssi=-50,
                n_color=(255,255,0)):
     self._address= n_address
     self._location=n_location
     self._status_bar =obj_statusbar
     self._comm_port = obj_comm

   def read_sensor(self):          
        if(  self._comm_port.read_bytes(10) != "112233445566778899AA"):
               self._status_bar.update_status_msg(" Data out of boundary")  
     ...
     # More code follows
status_bar = StatusBar()
comm_interface = SerialComm('COM4', status_bar, 19200)

Node_1 = Node(status_bar,comm_interface,0x9,Point(0, 0),-57,RED)
Node_2 = Node(status_bar,comm_interface,0xA,Point(2, 0),-57,GREEN)
Node_3 = Node(status_bar,comm_interface,0xB,Point(1, 2),-57,BLUE)
Node_4 = Node(status_bar,comm_interface,0xC,Point(1, 3),-57,ORANGE)
Node_5 = Node(status_bar,comm_interface,0xD,Point(1, 0),-57,BPINK)

1 个答案:

答案 0 :(得分:1)

这种方法很好。构造函数的重点是必须为它提供最少数量的参数,以便它可以在实例化后运行。如果您的节点依赖于状态栏实例,那么您应该将其传递给每个节点。

这使您可以灵活地在不同的关系中拥有多个节点,StatusBars和SerialComm对象。这对于模拟和单元测试尤为重要。不要试图使用某种全局黑客,比如使用单例或静态变量作为单例。那些很快就变得非常难以测试。