处理Python类“模式”变化的最佳方法

0 投票
2 回答
537 浏览
提问于 2025-04-17 18:38

我正在尝试创建一个用于高级电机控制的模块,这个模块会包含很多个 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 标签,但不太清楚它在这里怎么用,不过我觉得应该有更好的方法。

有什么想法吗?

2 个回答

1

全局的 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() 集成到你的类里。

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 实例的 operatingMode 赋值(包括在 Node 的构造函数里!),cansend 函数就会被调用,并传入新的值。

撰写回答