好好理解 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 没烦恼

(0)

相关推荐

  • Python学习—面向对象编程基础篇

    python面向对象编程已经学完了,有必要进行一下记录总结,加深一下理解,不然似懂非懂容易忘记:面向对象的知识点很多,其中面向对象的高级篇:元类,需要另外一篇博客来写,最后还要手撸一个简单版本的ORM ...

  • 为什么要有无参构造方法,无参构造的运行原理

    无参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法,因为系统会默认给我们提供一个无参构造方法,如果我们自己写了无参构造方法,那么我们这个就将默认的覆盖了. (这时候你可能回想,既然会默认 ...

  • Java子类实例化总是默认调用父类的无参构造方法

    2020-09-06 21:15:12 3点赞 Lucius_Keep_Going! 码龄3年 关注 继承关系的细节 子类拥有父类的属性和方法,但是对于父类的私有属性(private修饰),子类是无权 ...

  • 为什么要有无参构造方法

    无参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法,因为系统会默认给我们提供一个无参构造方法,如果我们自己写了无参构造方法,那么我们这个就将默认的覆盖了.那么为什么一定要有这么一个无参构 ...

  • Java中子类在实例化的时候调用父类的无参构造方法

    Java中子类在实例化的时候调用父类的无参构造方法

  • 诚之和:如何理解Python基础中的for循环语句

    如何理解Python基础中的for循环语句,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题. Python for循环可以遍历任何序列的项目 ...

  • 面向对象: 理解python类的单继承与多继承

    俗话说"龙生龙凤生凤老鼠的孩子会打洞",每种动物都有各自的特性,比如 老鼠会打洞 猫会爬树 鲨鱼会游泳 不同种类有不同的天性.而在程序员的思维中,动物是对象, 天性是这个类方法或者 ...

  • 一文理解 Python 中的变量

    " 变量让程序活起来,不再千人一面." 我们在之前的文章<Python 基本数据类型介绍>中了解了如何创建各种基本类型的数据,但是我们的例子中使用的都是"字面 ...

  • P百科:如何理解 Python 中的装饰器

    昨天 [P百科]:Python 大白话百科全书   每周,痴海会用大白话,讲解一个 Python 中那些难以理解的知识点.   希望通过这样的白话讲解,可以让大家更好的学会 Python.   今天这 ...

  • 如何理解波浪理论中的推动浪和修正浪?

    波浪理论是一套非常成熟的价格预测体系,它将价格的波动分为推动浪和修正浪,如果能够判断当前市场所处的位置,那么波浪理论就能够帮助我们找出一些高胜率的交易机会,做出更好的交易决策. 在今天的文章里,我们将 ...

  • Python面向对象有什么特性?三大点!

    我们都知道,Python是一门面向对象的编程语言,它具有三大特性,那么你知道Python面向对象三大特性是什么?接下来我们通过这篇文章来详细了解一下. 第一点:封装 隐藏对象的属性和实现细节,仅对外提 ...

  • 如何理解书法草书中的“一点二连三交代,四墨五紧六飞白”这句话?

    "一点二连三交代,四墨五紧六飞白."不知出处是何处,应该是草书者的经验及感悟,有一定道理,因此笔者愿与题主即各位同道朋友作一些探讨. 我们知道,笔法.字法.章法构成了书法的三要素, ...

  • Python|字符串中第二大的数字

    问题描述给你一个混合字符串s,请你返回s中第二大的数字,如果不存在第二大的数字,请你返回-1.混合字符串由小写英文字母和数字组成.示例:输入:s = 'dfa12321afd'输出:2解决方案这是一道 ...

  • 如何理解Excel公式中的各种符号?

    Q:在Excel公式中,我们会使用各种符号连接数字.单元格或函数,从而获得想要的结果,例如,=SQRT((1234-234)/100)^2.能够总结一下这些符号的使用吗? A:下面是Excel公式中使 ...