前言:
如今小伙伴们对“python类继承super”都比较关怀,姐妹们都需要了解一些“python类继承super”的相关内容。那么小编在网络上收集了一些关于“python类继承super””的相关内容,希望朋友们能喜欢,同学们一起来学习一下吧!原创: 小帅b 学习python的正确姿势
咱们上一篇讲到了继承,说到了子类和父类之间的关系,父类也叫作基类、超类,也就是 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 方法。
可以看到,这里是调用的顺序是: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老程序员,辞职目前在做自己的Python私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,可以送给每一位喜欢Python的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。