鱼C论坛

 找回密码
 立即注册
查看: 2095|回复: 6

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

[复制链接]
发表于 2018-3-2 21:39:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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 到底是什么意思?该怎么去理解。求大神指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-2 22:33:14 | 显示全部楼层
tgate.setNextPin(self)是把gate传入 setNextPin函数中么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-3 10:33:15 | 显示全部楼层
g3传入后,作为tgate,在Connector类使用tgate.setNextPin(self),
由于g3是或门,OrGate类,父类二进制门类BinaryGate才定义了setNextPin(self,source)
本身的这个函数是父类继承过来的而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
是这样子理解吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-3 15:52:21 | 显示全部楼层
snakeshe 发表于 2018-3-3 13:03
谢谢回答 但是我还是有些不理解,比如
g1 = AndGate('G1')
g3 = AndGate('G3')

说实话,我都很不想看了= =,关键引用的继承太乱,初始化也来回引用,我教你个方法
去改写程序,将输出结果变成加法计算,来看看是不是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的  我试试看 谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 23:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表