好好理解 Python 面向对象中的多继承和super

145 阅读4分钟
原文链接: zhuanlan.zhihu.com

最近有些朋友咨询 VIP 相关的事,我说就是在介绍文里面写的那些,分阶段进行的,知识就是那么些知识,没什么牛逼,只是我稍微能够讲得更容易理解一些罢了。


然后就有人问了,有没有试看?


我说了句“没有”之后,双方都略显尴尬,毕竟别的专栏都有好几篇试看文章,我倒好,篇篇都加密...


所以今天就放一篇 VIP 里面的基础内容吧,目前基础阶段即将完结,就当做试看好了,以后有机会的话就让每个阶段都放一篇试看出来吧,满足部分朋友的好奇心。


ok,以下是 VIP 基础阶段的试看文:




Python快速入门 | 好好理解 Python 面向对象中的多继承和super



咱们上一篇讲到了继承,说到了子类和父类之间的关系,父类也叫作基类、超类,也就是 super class ,上次我们说要在子类使用父类定义的东西,就需要用到 super 方法,有些朋友不太理解:不是说子类继承了父类,就直接都拥有了父类的东西了么?为啥要使用 super 呢?

其实,如果你对 对象 (也就是我们上上篇说的内容)之间的区别有一个明确的认识,你会明白:“类只是一个结构”,对吗?所以你在定义结构的时候,它并不是实例化出来的对象了,你只是定义,那么你在定义方法的时候想要用到 super 类的方法,你就只能用 super 来调用它。







当然,你也可以直接使用 super 类的名称进行调用,比如这样:




虽然可以直接使用父类的名称来调用父类的方法,但是这只是适用于单继承的情况(小帅b之前给你举的例子,黄种人继承了人类,就是一个单继承。)

接下来给你讲的多继承,相信你会对 super 更近一步的认识。

来举一个多继承的例子:





这里的 super 类是 Person ,衍生出了黄种人的爸爸这个类和白种人妈妈这个类,而儿子又继承了它们,用代码体现一下就是这样:




可以看到,YellowPeopleFather(Person) 和 WhitePersonMother(Person) 是我们之前熟悉的单继承,而 class Son(YellowPeopleFather, WhitePersonMother) 同时继承了 YellowPeopleFather 和 WhitePersonMother ,所以这就是多继承,最大的好处就是当我们实例化出 Son 对象的时候,可以同时拥有 YellowPeopleFather 和 WhitePersonMother 的东西:




可以看到,当我们实例化出 Son 这个对象的时候,可以使用到 YellowPeopleFather 和 play 方法,也可以使用到 WhitePersonMother 的 say 方法,当然,因为它们都继承于 Person ,所以 Son 这个对象还可以使用 Person 的 eat 方法:




那么,你有没有想过,如果 Son 的父类们都拥有相同的方法,Son 去调用它们的时候,会调用谁的方法呢?




这时候运行的结果是:




是的,它调用的是 YellowPeopleFather 里的方法,这是为什么呢?

这时候我们就要理解多重继承的子类,调用方法的顺序了,在 Python 中,使用到的是 MRO(你知道它是一种算法就行,先不用深究) ,我们可以通过调用子类的 mro 方法来具体查看:




可以看到,这里是调用的顺序是:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

因为我们的 Son 类没有定义 eat 方法,所以我们才会看到 Son 是调用了 YellowPeopleFather 里的 eat 方法。

那么到这里,我要跟你说 super 的本质意思了,当你调用 super 的时候,其实是调用 MRO 顺序的下一个类。

比如:




这样我们调用到的是 Son 里面的方法,没毛病吧? 那么此时我们想在 Son 里面使用 YellowPeopleFather 的 eat 方法,怎么用呢?根据 MRO 这个顺序:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

那么 super 的下一个就是啊,所以可以这样:




我们可以在 super 里面携带一个 MRO 顺序的前一个类,也就是刚刚的代码也可以这样写:




相同的道理,想要直接调用的是 WhitePersonMother 的 eat 方法呢?还是根据这个顺序:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

WhitePersonMother 的前一个是 YellowPeopleFather 对不对?所以就可以这样:




那么要用 Person 的,我想你应该知道了:




以上就是 Python 面向对象中的多继承和 super 的使用,请你自己私底下实现一下,体会其中的过程,做好笔记和总结。





扫一扫

学习 Python 没烦恼