好好理解 Python 面向对象中的多继承和super
最近有些朋友咨询 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 没烦恼