0

だから私は高レベルのモーターコントロール用のモジュールを作成しようとしています、そしてそれは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タグを発見しましたが、ここでどのように使用できるかは特にわかりませんが、もっと良い方法があると思います。

何かご意見は?

4

2 に答える 2

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関数が新しい値で呼び出されます。

于 2013-03-11T00:24:15.850 に答える
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()

于 2013-03-11T00:27:27.103 に答える