【发布时间】:2014-04-24 03:26:36
【问题描述】:
我目前正在自学 Python,并且正在阅读“使用算法和数据结构解决问题”(Brad Miller,David Ranum)。我偶然发现了继承的基本示例。虽然我可以看到它的作用,但我需要一个解释,如何它实际上是如何工作的。代码如下:
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()
我对@987654323@ 类__init__ 中的tgate.setNextPin(self) 语句最怀疑。是方法调用吗?如果是,为什么在UnaryGate 和BinaryGate 类(self, source) 中的setNexPin 函数实际需要两个参数时,只用一个参数调用它? fromgate 变量如何最终成为 source 参数?这句话是否真的“初始化”了什么?
接下来困扰我的事情是,例如,当我在声明g4.getOutput() 之前print(type(g4)) 时,我得到<class '__main__.OrGate'>,但是当g4.getOutput() 启动时,函数开始相互调用,直到调用getPin 函数,如果我将 print (self.pinA) 放在 return self.pinA.getFrom().getOutput() 之前,我会得到 <__main__.Connector object at 0x2b387e2f74d0>,尽管 self.Pin 是来自 g4 OrGate 实例的变量。一个类实例中的一个变量如何成为另一个类的对象,而不是继承它?这有没有setNextPin()函数的作用?
有人可以向我解释一下吗,因为我是 OOP 的新手,并且对这段代码感到非常困惑。谢谢。
【问题讨论】:
标签: python class oop inheritance python-3.x