利用python画钻石_python入门 -- 钻石继承(菱形继承)
在面向对象(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入门 -- 钻石继承(菱形继承)相关推荐
- 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...
利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...
- python画曲线-利用python画出AUC曲线的实例
以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...
- python中词云图怎样变成特殊图案_如何利用python画出一个多变的词云图?(1)...
问题描述: 如何利用python画出一个多变的词云图? 解决方法:import numpy as np import matplotlib import matplotlib.pyplot as pl ...
- python画一颗心_利用python画一颗心的方法示例
前言 Python一般使用Matplotlib制作统计图形,用它自己的说法是'让简单的事情简单,让复杂的事情变得可能'.用它可以制作折线图,直方图,条形图,散点图,饼图,谱图等等你能想到的和想不到的统 ...
- python怎么画出圆润的曲线_利用python画出AUC曲线的实例
以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...
- python画二维温度云图_利用python画出词云图
本文将介绍如何利用python中相应的模块画出词云图.首先给出效果图: 其中词云图中的词汇是对手机短信中的垃圾短信的统计,字体越大表示在垃圾短信中出现的频次越高.下面给出具体的步骤. 读取" ...
- 如何利用python画一些简单的图形
如何利用python画一些简单的图形 1 问题描述 在我们学习python的初期,就想拿一些实际问题来练手,好提高自己的技术.我们都了解可以用python画很多漂亮的图,但是作为新手的我们如何来画一些 ...
- 利用python画爱心表白
*七夕来袭!是时候展现专属于程序员的浪漫了! 创意代码表白 简单分享一下如何利用python画爱心表白 以程序员的方式撒狗粮,专业浪漫,值得拥有! 代码演示 # 导入海龟包 import turtle ...
- 利用python画梯形图案例
利用python画梯形图案例 import matplotlib.pyplot as plt import numpy as npdef mystep(x,y, ax=None, where='pre ...
最新文章
- Metasploit中aggregator插件无法使用
- 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器
- Haskell语言实现求解一个整数所有因子的代码及运行结果
- ***工具CC***的思路及防范方法
- [转载]UEditor报错TypeError: me.body is undefined
- 构造函数和clone以及在继承中
- dropdownlist ajax联动,asp.net省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例...
- 结对编程项目的过程记录与收获
- 暑假周进度总结报告6
- 浏览器UI线程更新机制
- 74款android开机动画,修改Android系统开机动画
- Python多线程好玩弹窗代码
- 论文解读:Structural Optimization Makes Graph Classification Simpler and Better
- 业务流程图设计-Visio设计
- 练习绕口令快速提高语言表达能力(收藏)
- Python3之入门小程序
- Elasticsearch系列01:基础教程
- CSS 滚动快照 Scroll Snap
- 新增免费 代理(Proxy)验证助手 自用 支持http/socks
- PyCharm界面字体放大和缩小
热门文章
- MTSEA,2732568-75-9可修饰游离半胱氨酸残基
- 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 5月12日
- C++ 点餐管理系统
- 运筹学_两阶段法对偶单纯形法_week5
- 红米1S移动3G版_标注:2014011_官方线刷包_救砖包_解账户锁
- 自由恋爱离婚率高.婚姻就是找匹配,无关形式
- 微信小程序 - eCharts- 展示中国地图
- Android 经典蓝牙(Classic Bluetooth)和低功耗蓝牙(BLE)
- h5 浮动布局及首字下沉
- wepy组件子父传值_wepy组件间传值