最好的方式来处理改变python类的'模式'
所以我试图创建一个高级别的电机控制模块,它将包含一批node
类的实例。创建后,每个节点将有一个nodeID
,busID
和operatingMode
。最好的方式来处理改变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标签,但没有具体看到它在这里如何使用,但我确实认为有更好的方法。
有什么想法?
如果我理解正确,您的node
实例每个都代表它们应该控制的物理电机。代码和电机本身之间的低层通信功能。您希望这样做,以便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
功能将被用新的价值。
全局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()
集成到您的类中。
你的解释是现货。非常感谢 – Chris 2013-03-11 00:59:05