在面向对象(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. Metasploit中aggregator插件无法使用
  2. 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器
  3. Haskell语言实现求解一个整数所有因子的代码及运行结果
  4. ***工具CC***的思路及防范方法
  5. [转载]UEditor报错TypeError: me.body is undefined
  6. 构造函数和clone以及在继承中
  7. dropdownlist ajax联动,asp.net省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例...
  8. 结对编程项目的过程记录与收获
  9. 暑假周进度总结报告6
  10. 浏览器UI线程更新机制
  11. 74款android开机动画,修改Android系统开机动画
  12. Python多线程好玩弹窗代码
  13. 论文解读:Structural Optimization Makes Graph Classification Simpler and Better
  14. 业务流程图设计-Visio设计
  15. 练习绕口令快速提高语言表达能力(收藏)
  16. Python3之入门小程序
  17. Elasticsearch系列01:基础教程
  18. CSS 滚动快照 Scroll Snap
  19. 新增免费 代理(Proxy)验证助手 自用 支持http/socks
  20. PyCharm界面字体放大和缩小

热门文章

  1. MTSEA,2732568-75-9可修饰游离半胱氨酸残基
  2. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 5月12日
  3. C++ 点餐管理系统
  4. 运筹学_两阶段法对偶单纯形法_week5
  5. 红米1S移动3G版_标注:2014011_官方线刷包_救砖包_解账户锁
  6. 自由恋爱离婚率高.婚姻就是找匹配,无关形式
  7. 微信小程序 - eCharts- 展示中国地图
  8. Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)
  9. h5 浮动布局及首字下沉
  10. wepy组件子父传值_wepy组件间传值