Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поясните код 
:(
    Опции темы
zhz
Дата 25.11.2014, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 31.10.2006
Где: Petropavlovsk-Kam chatsky

Репутация: нет
Всего: 2



Учу питон, есть вот такой код
Код

__author__ = 'hz'


class LogicGate:
    def __init__(self, n):
        self.name = n
        self.output = None

    def getLabel(self):
        return self.name

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


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

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter a pin A input for gate " + self.getLabel() + "--->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter a pin B for gate " + self.getLabel() + "--->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source

        elif self.pinB == None:
            self.pinB = source
        else:
            return RuntimeError("ERROR : No empty pins!")


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

        self.pin = None

    def getPin(self):
        if self.pin == None:
            return int(input("Enter a pin  for gate " + self.getLabel() + "--->"))
        else:
            return self.pin.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pin == None:
            self.pin = source
        else:
            print("Cannot connect: no empty pin on this gate ")




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

class OrGate(BinaryGate):
    def __init__(self, n):
        BinaryGate.__init__(self, n)

    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()

        if a == 0 and b == 0:
            return 0
        else:
            return 1

class NotGate(UnaryGate):
    def __init__(self, n):
        UnaryGate.__init__(self, n)

    def performGateLogic(self):
        a = self.getPin()

        if a == 0:
            return 1
        elif a == 1:
            return 0


class Connector():
    def __init__(self, fgate, tgate):
        self.fromgate = fgate
        self.togate = tgate

        tgate.setNextPin(self)

    def getFrom(self):
        return self.fromgate

    def getTo(self):
        return self.togate


def main():
   g1 = AndGate("G1")
   g2 = AndGate("G2")
   g3 = OrGate("G3")
   g4 = NotGate("G4")
   c1 = Connector(g1, g3)
   c2 = Connector(g2, g3)
   c3 = Connector(g3, g4)
   print(g4.getOutput())

main()


Например в классе BinaryGate есть строка 
Код

return self.pinA.getFrom().getOutput()

Метод getFrom() определен в классе Connector, ну вот КАК он может быть вызван у аттрибута pinA ?? 
PM MAIL ICQ   Вверх
SoWa
Дата 25.11.2014, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



Обычное наследование.
В конструкторе Connector происходит вызов setNextPin и ему передается экземпляр Connector, который записывается в pinA или pinB. И у них спокойно вызывается getFrom


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
bilbobagginz
Дата 11.12.2014, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 6
Всего: 317



Привет. Наследство - обычно дело грязное smile
Из-за мягкой типизации языка, рекомендуется делать валидацию типа, т.е. напр. в данном случае, рекомендуется проверить, что setNextPin() принимает параметр, рожденный от класса Connector.
Это также проясняет читателю кода, откуда могут быть методы объекта члена self.pinA, т.е.:
Код

     def setNextPin(self, source):
        assert issubclass(type(source), Connector), "source must be a Connector, but is: " + type(source)
        if not self.pin:
            self.pin = source
        else:
            print("Cannot connect: no empty pin on this gate ")

как-то так.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0824 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.