关于python逻辑门一段代码的小问题
有没有大佬可以解释下在以下逻辑门代码中,在getPinA()中self.pinA.getFrom().getOutput()这段函数到底是怎么运行的?
或者说为什么self.pinA是属于connector类的?万分感谢!
自问自答:其实是self的指向没有搞明白,在Connector类实例化时,运行了tgate.setNextPin(self)这段代码并向其中传递了自己的实例,而在BinaryGate类的setNextPin(self, source)这段代码中的source即是在Connector实例化时传递进来的Connector实例,此时就可以发现self.pinA成为了Connector实例,因此也就可以调用Connector类中的getFrom()的函数方法了。
在想通这个问题的过程之中发现也有些和我一样的刚入门小白也有同样的疑问,因此把这个解释分享出来,希望可以对和我一样的同学有些帮助。
class LogicGate:
def __init__(self, n):
self.label = n
self.output = None
def getLabel(self):
return self.label
def getOutput(self):
self.output = self.performGateLogic()
return self.output
class BinaryGate(LogicGate):
def __init__(self, n):
super().__init__(n)
self.pinA = None
self.pinB = None
def getPinA(self):
if self.pinA == None:
return int(input("Enter Pin A input for gate " + \
self.getLabel() + "--->"))
else:
return self.pinA.getFrom().getOutput()
def getPinB(self):
if self.pinB == None:
return int(input("Enter Pin B input for gate " + \
self.getLabel() + "--->"))
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:
raise RuntimeError("Error: NO EMPTY PINS")
class UnaryGate(LogicGate):
def __init__(self, n):
super().__init__(n)
self.pin = None
def getPin(self):
if self.pin == None:
return int(input("Enter Pin A input for gate " + \
self.getLabel() + "--->"))
else:
return self.pin.getFrom().getOutput()
def setNextPin(self, source):
if self.pin == None:
self.pin = source
else:
raise RuntimeError("Error: NO EMPTY PINS")
class AndGate(BinaryGate):
def __init__(self, n):
super().__init__(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):
super().__init__(n)
def performGateLogic(self):
a = self.getPinA()
b = self.getPinB()
if a==1 or b==1:
return 1
else:
return 0
class NotGate(UnaryGate):
def __init__(self, n):
super().__init__(n)
def performGateLogic(self):
a = self.getPin()
if a==1:
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
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())
====>0