在面向对象(OOP)编程中,很多情况下会遇到多继承和多重继承的问题和坑,这里带对大家

认识一下其中的一个钻石继承(菱形继承)的问题。

什么时候会出现钻石继承(菱形继承)呢?

当在类树中,由多个类共享同一个父类的时候,钻石继承就出现了。

为什么会出现钻石继承(菱形继承)呢?

这里先带大家理解一下python中关于继承的一些概念

1. 多继承:多继承就是在声明类的时候,在类名后面的括号中出现一个以上的父类,这

中情况就叫做多继承。

也就是一个子类继承一个以上的父类

2. 在python中,因为多继承的存在,就会导致出现钻石继承的问题,这里举个例子说明

下面是一个代码的例子:

class Super(object):

def __init__(self, name):

print('Super类的初始化方法开始执行')

self.name = name

print('Super类的初始化方法执行完毕')

class Parent1(Super):

def __init__(self, name):

print('Parent1类的初始化方法开始执行')

Super.__init__(self, name)

print('Parent1类的初始化方法执行完毕')

class Parent2(Super):

def __init__(self, name):

print('Parent2类的初始化方法开始执行')

Super.__init__(self, name)

print('Parent2类的初始化方法执行完毕')

class Son(Parent1, Parent2):

def __init__(self, name):

print('Son类的初始化方法开始执行')

Parent1.__init__(self, name)

Parent2.__init__(self, name)

print('Son类的初始化方法执行完毕')

son = Son('spam')

打印结果如下:

Son类的初始化方法开始执行

Parent1类的初始化方法开始执行

Super类的初始化方法开始执行

Super类的初始化方法执行完毕

Parent1类的初始化方法执行完毕

Parent2类的初始化方法开始执行

Super类的初始化方法开始执行

Super类的初始化方法执行完毕

Parent2类的初始化方法执行完毕

Son类的初始化方法执行完毕

在这里我们可以很清楚的看到,Super类的构造函数被调用了两次,这就会出现问题了,如果 在某些应用场景下,Super的构造函数是一个计数器,那么就会导致错误的结果了。

那么怎么解决钻石继承的问题呢?

为了解决这个问题,python中专门引入了MRO顺序来解决这个问题。

MRO顺序本质上执行的是广度优先搜索,从左到右,搜索完同一层级的时候,向上爬升。

保证了每个类中的方法只会被执行一次。避免了同一个类被调用多次的情况。

查看MRO顺序

类名.__mro__

(, , , , )

这里就引出了python中super()函数的作用了

1. super()函数是用来调用父类的一个方法,是为了解决多重继承的问题的

2. 使用super()函数调用的是在mro顺序中的直接父类

3. super()的主要作用是不需要使用父类名来调用父类的方法,单子类改为继承其他父类的时候,不需要对子类

内部的调用父类的函数做任何修改就可以调用新父类的方法。增强了代码的可维护性。不需要在所有调用的地方进

行修改。

4. super()函数返回一个代理对象作为代表来调用父类的方法。对于访问已经在类中重写的继承方法是十分有用

利用python画钻石_python入门 -- 钻石继承(菱形继承)相关推荐

  1. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  2. python画曲线-利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...

  3. python中词云图怎样变成特殊图案_如何利用python画出一个多变的词云图?(1)...

    问题描述: 如何利用python画出一个多变的词云图? 解决方法:import numpy as np import matplotlib import matplotlib.pyplot as pl ...

  4. python画一颗心_利用python画一颗心的方法示例

    前言 Python一般使用Matplotlib制作统计图形,用它自己的说法是'让简单的事情简单,让复杂的事情变得可能'.用它可以制作折线图,直方图,条形图,散点图,饼图,谱图等等你能想到的和想不到的统 ...

  5. python怎么画出圆润的曲线_利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...

  6. python画二维温度云图_利用python画出词云图

    本文将介绍如何利用python中相应的模块画出词云图.首先给出效果图: 其中词云图中的词汇是对手机短信中的垃圾短信的统计,字体越大表示在垃圾短信中出现的频次越高.下面给出具体的步骤. 读取" ...

  7. 如何利用python画一些简单的图形

    如何利用python画一些简单的图形 1 问题描述 在我们学习python的初期,就想拿一些实际问题来练手,好提高自己的技术.我们都了解可以用python画很多漂亮的图,但是作为新手的我们如何来画一些 ...

  8. 利用python画爱心表白

    *七夕来袭!是时候展现专属于程序员的浪漫了! 创意代码表白 简单分享一下如何利用python画爱心表白 以程序员的方式撒狗粮,专业浪漫,值得拥有! 代码演示 # 导入海龟包 import turtle ...

  9. 利用python画梯形图案例

    利用python画梯形图案例 import matplotlib.pyplot as plt import numpy as npdef mystep(x,y, ax=None, where='pre ...

最新文章

  1. Linux配置vlan网关
  2. 通过python实现超市购物系统(通过列表简单实现版)
  3. python requests的安装与简单运用
  4. Android之一张类图说明AMS
  5. python中升级pip报错_linux系统下pip升级报错的解决方法
  6. 206. 反转链表 golang
  7. 单线程的Redis为什么却能支撑高并发?
  8. 【mysql基础知识】通过Navicat控制小数点位数,以及填充0后不显示的问题
  9. ORA-28001: the password has expired (DBD ERROR: OCISessionBegin)解决办法
  10. linux设置自启动方式
  11. [转载]快速实现微信扫码关注公众号/用户注册并登陆
  12. can总线程序讲解_详解CAN总线
  13. mysql 基础语法3
  14. Shader学习建议
  15. 笔记本电脑换加内存条与加固态硬盘详细介绍
  16. 工作小笔记——使用Cartographer建图和调优
  17. 大数据医疗正进入信息共享
  18. 基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)
  19. Spirngboot整合之Mybatis-plus yml配置
  20. 苹果手机测试网络速度的软件,iPhone6怎么看网速?查看苹果6 Plus网速给不给力的方法...

热门文章

  1. iOS程序员的命令行使用
  2. CSS3 transform-style 属性(3d转换模块)
  3. java解决循环引用_Java 中如何避免循环引用,解决相互依赖的问题
  4. 【UE5 Mass AI 基础教程一】代理生成
  5. Java控制台打印爱心算法(今典算法案例)
  6. web 后台管理 消息弹窗实现
  7. python-max函数
  8. 12:CORS跨域设置-Java Spring
  9. html5支持的几种音频格式介绍
  10. vue js打印并去掉页眉和页脚