2016-07-07 67 views
0

我从面向对象编程:IS-A与HAS-A的关系?

问题学习面向对象的编程使用的交互式Python网站提供的在线版本的算法和数据结构解决

书。链接在下面提到。

Object Oriented Programming

我听不太懂那是在上面的链接中提到的Connector类。 IS-A和HAS-A关系的区别究竟是什么?

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 

方法setNextPinBinaryGate(LogicGate)定义具有source的输入。但是当它在Connector课程中被访问时,我们没有提供第二个参数。那么即使没有提供所有参数,它如何实现。

另外,Connector类中的setNextPin方法如何理解它可以访问为BinaryGate类定义的方法?

我试过了,但我不知道。有人可以帮助我理解这一点。

+0

要回答你的第一个子问题:调用'tgate.setNextPin(self)'确实会导致方法在其声明中接收两个名为'self'和'source'的参数。每当一个对象方法被调用时,它传递的第一个参数总是对象 - 这是调用者中的'tgate' - 加上方法名称后面括号中列出的任何附加参数。在这种情况下,它是调用者端被称为'self'的'Connector'实例,但在被调用者的代码中被称为'source'。双方不同的名字可能是你在这一点上混淆的原因。 – martineau

+0

非常感谢@martineau。我之前在OOP中阅读过这种实现。但是直到你提到这件事,我才弄明白。谢谢 – RTM

回答

0

这里缺少两件事:隐含的函数参数和鸭子打字。

首先,语法tgate.setNextPin(self)调用函数setNextPin(tgate, self)。第一个参数是调用该方法的对象(通常命名为self)。您会感到困惑,因为我们将self作为第二个参数传递给函数setNextPin,但该函数的第一个参数也称为self。这是一个范围问题,这两个self指的是不同的参数(取决于你所在的功能)。

其次,有鸭子打字。函数如何知道它可以访问BinaryGate类中的方法?它根本不知道!所有函数知道的是,它预计tgate是一种方法setNextPin的类型。无论这是否为BinaryGate或任何其他对象都无关紧要。如果传递的对象没有此方法调用,那么Python将在运行时失败,因为它将无法找到要调用的函数setNextPin

+0

谢谢@dave。我会阅读更多关于鸭子打字的信息。只要'tgate'类具有'setNextPin'方法,当你解释它是否为'BinaryGate'或任何其他对象时,它就很有意义 – RTM