2015-12-16 2 views
0
class LogicGate(object): 

    def __init__(self, n): 
     self.label = n 
     self.output = None # ???????????? 

    def getOutput(self): 
     self.output = self.performGateLogic() 
     return self.output 

    def getLabel(self): 
     return self.label 

class BinaryGate(LogicGate): 

    def __init__(self, n): # ????????????????? 
     LogicGate.__init__(self, n) 

     self.pinA = None # ?????????????? 
     self.pinB = None # ?????????????? 

    def getPinA(self): 
     return int(raw_input('Enter Pin A input for gate' + self.getLabel() + '-->')) 

    def getPinB(self): 
     return int(raw_input('Enter Pin A input for gate' + self.getLabel() + '-->')) 

class UnaryGate(LogicGate): 

    def __init__(self, n): # ?????????????? 
     LogicGate.__init__(self, n) 

     self.pin = None # ????????????? 

    def getPin(self): 
     return int(raw_input('Enter Pin input for gate' + self.getLabel() + '-->')) 

class AndGate(BinaryGate): 

    def __init__(self, n): # ???????????? 
     BinaryGate.__init__(self, n) 

    def performGateLogic(self): 

     a = self.getPinA() 
     b = self.getPinB() 
     if a == 1 and b == 1: 
      return 1 
     else: 
      return 0 

Этот код принадлежит к решению проблем с алгоритмами и структурами дат. Когда я удаляю строки перед комментарием «# ????????», код может работать нормально. Почему автор пишет код следующим образом? Хороший ли стиль кода? Могу я всегда удалять эти строки перед комментарием '# ????????' ?Python 2.7, в чем преимущество такого рода инициализации в классе?

+1

Он работает, как с, так и без этих линий. – hd1

+0

Рассмотрите ситуацию, когда вы хотите проверить, есть ли у вас соответствующие условия для продолжения (прямо перед очень дорогостоящей операцией). 'if self.pinA is None:'. –

+1

По-моему, это действительно плохо разработанный код. Это похоже на то, что Java-соглашения были принудительно установлены в Python. –

ответ

1

Автор пишет такой код, потому что это хорошая практика никогда не иметь неинициализированных членов и родителей классов, статические шашки стонут, если вы это сделаете.

Причина, по которой это не хорошая практика для будущих ремонтопригодность - скажем, что базовый класс, LogicGate, должен был получить новое свойство - говорят propagation_delay и новый метод, который позволил симуляции называется get_response_time, которые полагались на текущее состояние выхода и требуемое, возможно, новое состояние. Если весь код, полученный из этого класса, выполнил правильные инициализации, тогда все будет работать нормально, без каких-либо изменений. Если вы удалите эти строки и появился такой новый метод, вам придется вернуться через все дочерние классы, добавив их обратно до того, как ваш последний класс будет работать для этого метода, с возможностью пропустить один.

Daft, поскольку он звучит правильно, теперь это на самом деле будущая лень - вам требуется только секунды, когда вы создаете класс, чтобы убедиться, что все инициализировано - отладка неинициализированного класса может занять несколько часов.

0

Первое:
В __init__ функции конструкторы классов, вы можете прочитать о них here.

Второе:
Ваш код будет работать без этих линий, но вопрос в том, почему и это нормально, чтобы удалить их?

Например, если вы удалите следующие инициализации

class UnaryGate(LogicGate): # LogicGate is the superclass 

    def __init__(self, n): 
     LogicGate.__init__(self, n) 

Конструктор супер-класса LogicGate будет называться непосредственно.

Третье:
Итак, мы можем удалить self.xxx = None?

class BinaryGate(LogicGate): 

    def __init__(self, n): 
     LogicGate.__init__(self, n) 

     self.pinA = None 
     self.pinB = None 

Мы могли бы удалить эти 2 линии тоже, но считают этот код

bg = BinaryGate("binaryGate1") 
print bg.pinA 

Это будет сгенерировано сообщение об ошибке, потому что pinA не определено.
Если вы не удалите self.pinA = None в __init__, код будет запущен и будет напечатан None.