处理Python类“模式”变化的最佳方法
我正在尝试创建一个用于高级电机控制的模块,这个模块会包含很多个 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 标签,但不太清楚它在这里怎么用,不过我觉得应该有更好的方法。
有什么想法吗?
2 个回答
全局的 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()
集成到你的类里。
如果我理解得没错,你的 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)
现在,每当你给 Node
实例的 operatingMode
赋值(包括在 Node
的构造函数里!),cansend
函数就会被调用,并传入新的值。