我们在上一节课中已经提到了继承的功能了,当我们用class Banana(Fruit) 的时候已经开始了继承,即让Banana去继承Fruit这个类。继承意味着一个类(Banana)的大部分或者全部功能来自其父类(Fruit)。具体而言继承的方式有三种:
(1)隐式继承
在上面的代码中,我们用pass创建空代码,也就是说在Child这个类中只继承Parent类而没有任何别的定义和操作,我们把这种继承方式叫做隐式继承。注意到上面的代码中我们在Child这个类当中没有定义带有打印功能的函数,它通过继承父类Parent中的打印函数来自动获得。
运行结果:
(2)显式覆盖
假想我们在子类中定义一个和父类同样的函数,会发生什么呢?答案是子类中的函数会覆盖来自于父类中的函数,也就是说子类用的函数是自己定义的,而非从父类中继承来的。当然我们这里的覆盖的意思不是所把父类的函数也改变。
这个代码中,我们给子类Child也定义了function,打印的内容换成了How old are you。于是我们将会看到两个类的实例出来的结果是不一样的。
运行结果:
(3)在运行前或运行后替换
显式覆盖的方法会让子类完全覆盖来自于父类的继承。而如果我们使用上一节课提到的super函数会带来一个特殊的效果,当在显示覆盖中使用一次super,则会让子类暂时继承父类,而在运行super函数前后还是会显式覆盖,废话不多说,上代码:
这个代码看上去有点绕,我们仔细分析一下。在父类中我们定义了function,打印内容是Hello World,而在子类中,我们也定义了同名的function,按照第二种显示覆盖继承的方法,这里function中的内容应该和父类没有任何关系,因为需要满足覆盖原则。但是我们稍有不同,我们中里面调用了super函数,其起到的效果是短暂继承父类中的function。我们来看运行结果:
这个结果还是挺神奇的,第三行的Hello World就是来自于父类的打印内容。
super()和__init__()
在实际操作中,我们一般会在子类的__init__()函数中对父类进行初始化。代码如下
这里的super(Child, self)其实可以等效于Parent。