所以我正在尝试创建一个用于高级电机控制的模块,它将包含一堆node
类的实例。创建后,每个节点都会有nodeID
,busID
和operatingMode
。
初始化节点对象后,我向电机发送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标签,但没有特别注意如何在这里使用它,但我觉得有更好的方法。
有什么想法吗?
答案 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()
集成到您的课程中。