2013-03-11 93 views
0

所以我试图创建一个高级别的电机控制模块,它将包含一批node类的实例。创建后,每个节点将有一个nodeID,busIDoperatingMode最好的方式来处理改变python类的'模式'

初始化一个节点对象后,我发送一个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标签,但没有具体看到它在这里如何使用,但我确实认为有更好的方法。

有什么想法?

回答

1

如果我理解正确,您的node实例每个都代表它们应该控制的物理电机。代码和电机本身之间的低层通信功能。您希望这样做,以便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) 

现在,分配给operatingModeNode实例的任何时间(!包括在Node构造函数本身),该cansend功能将被用新的价值。

+0

你的解释是现货。非常感谢 – Chris 2013-03-11 00:59:05

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()集成到您的类中。