处理python类的'模式'变换的最佳方法

时间:2013-03-11 00:10:52

标签: python class properties

所以我正在尝试创建一个用于高级电机控制的模块,它将包含一堆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 个答案:

答案 0 :(得分:1)

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

以下是使用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函数值。

答案 1 :(得分: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()集成到您的课程中。