snakeshe 发表于 2018-3-2 21:39:30

关于用python模仿逻辑电路的一个小例子

class LogicGate:

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

    def getName(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 Pin A input for gate "+self.getName()+"-->"))
      else:
            return self.pinA.getFrom().getOutput()

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

    def setNextPin(self,source):
      if self.pinA == None:
            self.pinA = source
      else:
            if self.pinB == None:
                self.pinB = source
            else:
                print("Cannot Connect: NO EMPTY PINS 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 ==1 or b==1:
            return 1
      else:
            return 0

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 Pin input for gate "+self.getName()+"-->"))
      else:
            return self.pin.getFrom().getOutput()

    def setNextPin(self,source):
      if self.pin == None:
            self.pin = source
      else:
            print("Cannot Connect: NO EMPTY PINS on this gate")


class NotGate(UnaryGate):

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

    def performGateLogic(self):
      if self.getPin():
            return 0
      else:
            return 1


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()

这是个魔方逻辑门的程序,我是在搞不懂 g3传入tgate.setNextPin()之后到 BinaryGate(LogicGate)再去执行def setNextPin(self,source)中source 到底是什么意思?该怎么去理解。求大神指点

snakeshe 发表于 2018-3-2 22:33:14

tgate.setNextPin(self)是把gate传入 setNextPin函数中么?

塔利班 发表于 2018-3-3 10:33:15

g3传入后,作为tgate,在Connector类使用tgate.setNextPin(self),
由于g3是或门,OrGate类,父类二进制门类BinaryGate才定义了setNextPin(self,source)
本身的这个函数是父类继承过来的而已

snakeshe 发表于 2018-3-3 13:03:01

塔利班 发表于 2018-3-3 10:33
g3传入后,作为tgate,在Connector类使用tgate.setNextPin(self),
由于g3是或门,OrGate类,父类二进制门 ...

谢谢回答 但是我还是有些不理解,比如
g1 = AndGate('G1')
g3 = AndGate('G3')
c1 = Connector(g1,g3)
g1,g3 传入进 Connector,
然后g3.setNextPin 会把 self.fromgate 和 self.togate 都传入进 setNextPin ,
输出 self.fromgae ,self.togate

souce就是 g1,g3
是这样子理解吗?

塔利班 发表于 2018-3-3 15:52:21

snakeshe 发表于 2018-3-3 13:03
谢谢回答 但是我还是有些不理解,比如
g1 = AndGate('G1')
g3 = AndGate('G3')


说实话,我都很不想看了= =,关键引用的继承太乱,初始化也来回引用,我教你个方法
去改写程序,将输出结果变成加法计算,来看看是不是这样{:10_316:}{:10_251:}

snakeshe 发表于 2018-3-3 18:10:09

塔利班 发表于 2018-3-3 15:52
说实话,我都很不想看了= =,关键引用的继承太乱,初始化也来回引用,我教你个方法
去改写程序,将输出 ...

好的我试试看 谢谢你

a5172325 发表于 2020-4-3 21:50:29

snakeshe 发表于 2018-3-3 13:03
谢谢回答 但是我还是有些不理解,比如
g1 = AndGate('G1')
g3 = AndGate('G3')


这里的 source ,就是指向这 connector(g1,g3)这个类,之后把这个类赋给 self.pin,所以才可以调用 getFrom()的方法
页: [1]
查看完整版本: 关于用python模仿逻辑电路的一个小例子