2013-03-11 2 views
0

Итак, я пытаюсь создать модуль для управления двигателем высокого уровня, и он будет содержать кучу экземпляров класса 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, но не вижу особо, как его можно использовать здесь, однако я чувствую, что есть лучший способ.

Любые мысли?

ответ

1

Если я правильно понимаю, ваши node экземпляров представляют физический двигатель, которым они должны управлять. Функция cansend заботится о низкоуровневой связи между кодом и самим двигателем. Вы хотите сделать так, чтобы изменения в значениях 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 будет вызвана с новое значение.

+0

Ваша интерпретация была на месте. Большое спасибо – Chris

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() в свой класс, если хотите.

Смежные вопросы