0

所以我正在尝试为高级电机控制创建一个模块,它将包含一堆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 标签,但没有特别看到它如何在这里使用,但我确实觉得有更好的方法。

有什么想法吗?

4

2 回答 2

1

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

以下是如何使用 a 执行此操作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)

现在,任何时候你operatingMode在一个Node实例上赋值(包括在Node构造函数本身中!),这个cansend函数都会被新值调用。

于 2013-03-11T00:24:15.850 回答
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()根据需要将全局集成到您的类中。

于 2013-03-11T00:27:27.103 回答