【问题标题】:Best way to handle changing 'mode' of a python class处理更改 python 类的“模式”的最佳方法
【发布时间】:2013-03-11 00:10:51
【问题描述】:

所以我正在尝试创建一个用于高级电机控制的模块,它将包含node 类的一堆实例。创建后,每个节点都会有一个nodeIDbusIDoperatingMode

在初始化节点对象时,我向电机发送一个 CAN 帧,说“嘿,这是你想要的操作模式”。执行此操作的命令称为 cansend。

我已经粗略地编写了代码(手边没有)供您参考:

def cansend(nodeID,busID,value):
'''sends a CAN frame with a particular value to a specific node'''


class node(object):
    def __init__(self,nodeID,busID,operatingMode):
        self.nodeID=nodeID
        self.busID=busID
        self.operatingMode=operatingMode
        cansend(self.nodeID,self.busID,operatingMode

我遇到的问题是,如果我想即时更改操作模式(我确实这样做了),那么似乎我必须创建单独的函数,可能是这样的:

    def setOperatingMode(self,operatingMode):
        cansend(self.nodeID,self.busID,operatingMode)

__init__ 方法和setOperatingMode 方法中创建这一行似乎有点多余。我最近发现了@property 标签,但没有特别了解如何在这里使用它,但我确实觉得有更好的方法。

有什么想法吗?

【问题讨论】:

    标签: python class properties


    【解决方案1】:

    如果我理解正确,您的 node 实例每个都代表它们应该控制的物理电机。 cansend 函数负责代码和电机本身之间的低级通信。您想这样做,以便将对 NodeoperatingMode 值的更改发送到电机。

    以下是使用property 的方法:

    class Node(object):
        def __init__(self, nodeID, busID, operatingMode)
            self.nodeID = nodeID
            self.busID = busID
            self.operatingMode = operatingMode
    
        @property
        def operatingMode(self):
            return self._operatingMode
    
        @operatingMode.setter
        def operatingMode(self, mode):
            self._operatingMode = mode
            cansend(self.nodeID, self.busID, mode)
    

    现在,每当您在 Node 实例上(包括在 Node 构造函数本身中)分配给 operatingMode 时,都会使用新值调用 cansend 函数。

    【讨论】:

      【解决方案2】:

      全局 cansend() 函数是通用的,可以从任何地方调用,所以我可能会保留这个函数,除非每次调用 cansend() 都来自节点类。

      您可以向您的类添加一个cansend() 方法,该方法使用存储的实例变量作为输入,而不是将它们设置为参数。此外,如果您对使用属性感兴趣,可以按照您的建议将 operatingMode 配置为属性。

      这是一个重构示例:

      def cansend(nodeID,busID,value):
      '''sends a CAN frame with a particular value to a specific node'''
      
      
      class node(object):
          def __init__(self,nodeID,busID,operatingMode):
              self.nodeID = nodeID
              self.busID = busID
              self._operatingMode = operatingMode
              self.send_can_mode()
      
          def send_can_mode(self):
              """Send current operating mode to node on CAN bus."""
              cansend(self.nodeID, self.busID, self._operatingMode)
      
          @property
          def operatingMode(self):
              """Return current operating mode."""
              return self._operatingMode
      
          @operatingMode.setter
          def operatingMode(self, value):
              """Modify operating mode.  Update remote node if mode changes."""
              if value == self._operatingMode:
                  return
              self._operatingMode = value
              self.send_can_mode()
      

      当你想改变模式时,你可以node.operatingMode = newMode,如果模式从之前的状态改变了,会自动发送新的模式。

      全局 cansend() 仅从 send_can_mode() 方法调用,因此您可以根据需要将全局 cansend() 集成到您的类中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-01-25
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多