Python高级编程之继承问题详解(super与mro)


Posted in Python onNovember 19, 2019

本文实例讲述了Python高级编程之继承问题。分享给大家供大家参考,具体如下:

多继承问题

1.单独调用父类:

一个子类同时继承自多个父类,又称菱形继承、钻石继承。

使用父类名.init(self)方式调用父类时:

例:

class Parent(object):
  def __init__(self, name):
    self.name = name
    print('parent的init结束被调用')
class Son1(Parent):
  def __init__(self, name, age):
    Parent.__init__(self, name)
    self.age = age
    print('Son1的init结束被调用')
class Son2(Parent):
  def __init__(self, name, gender):
    Parent.__init__(self, name)
    self.gender = gender
    print('Son2的init结束被调用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    Son1.__init__(self, name, age) # 单独调用父类的初始化方法
    Son2.__init__(self, name, gender)
    print('Grandson的init结束被调用')
gs = Grandson('grandson', 12, '男')

执行结果:

Python高级编程之继承问题详解(super与mro)

可以看出使用父类名.init(self)方式调用父类时,parent父类被调用了两次,此方法对于多继承不太合适。

2.MRO顺序:

上述代码,我们发现由于多继承情况,parent类被的属性被构造了两次,如果在更加复杂的结构下可能更加严重。

为了解决这个问题,Python官方采用了一个算法将复杂结构上所有的类全部都映射到一个线性顺序上,而根据这个顺序就能够保证所有的类都会被构造一次。

这个顺序就是MRO顺序。

MRO顺序采用C3算法广度优先遍历。

使用方法: 类名.mro()或类名.mro()

Python高级编程之继承问题详解(super与mro)

3.super调用父类:

使用super().init()方式调用父类时:

例:

class Parent(object):
  def __init__(self, name, *args, **kwargs): # 为避免多继承报错,使用不定长参数,接受参数
    self.name = name
    print('parent的init结束被调用')
class Son1(Parent):
  def __init__(self, name, age, *args, **kwargs): # 为避免多继承报错,使用不定长参数,接受参数
    self.age = age
    super().__init__(name, *args, **kwargs) # 为避免多继承报错,使用不定长参数,接受参数
    print('Son1的init结束被调用')
class Son2(Parent):
  def __init__(self, name, gender, *args, **kwargs): # 为避免多继承报错,使用不定长参数,接受参数
    self.gender = gender
    super().__init__(name, *args, **kwargs) # 为避免多继承报错,使用不定长参数,接受参数
    print('Son2的init结束被调用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    # 多继承时,相对于使用类名.__init__方法,要把每个父类全部写一遍
    # 而super只用一句话,执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因
    # super(Grandson, self).__init__(name, age, gender)
    super().__init__(name, age, gender)
    print('Grandson的init结束被调用')
gs = Grandson('grandson', 12, '男')
print(Grandson.__mro__)

运行结果:

Python高级编程之继承问题详解(super与mro)

parent父类只被调用了一次,super方法会按照MRO顺序调用下一个父类。

总结:

(1)MRO保证了多继承情况 每个类只出现一次

(2)super().init相对于类名.init,在单继承上用法基本无差

(3)但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次

(4)多继承时,使用super方法,对父类的传参数,是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错

(5)单继承时,使用super方法,不能全部传递,只能传父类方法所需的参数,否则会报错

(6)多继承时,相对于使用类名.init方法,要把每个父类全部写一遍, 而使用super方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
Python兔子毒药问题实例分析
Mar 05 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
Django实现基于类的分页功能
Oct 31 Python
基于Python获取城市近7天天气预报
Nov 26 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python 实现任务管理清单案例
Apr 25 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
利用python做表格数据处理
Apr 13 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 #Python
Python csv文件的读写操作实例详解
Nov 19 #Python
Python高级property属性用法实例分析
Nov 19 #Python
wxPython之wx.DC绘制形状
Nov 19 #Python
python matplotlib拟合直线的实现
Nov 19 #Python
Python线程指南分享
Nov 19 #Python
wxpython+pymysql实现用户登陆功能
Nov 19 #Python
You might like
PHP对字符串的递增运算分析
2010/08/08 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
Javascript实现动态时钟效果
2018/11/17 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
Python open()文件处理使用介绍
2014/11/30 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python输出带颜色的字符串实例
2017/10/10 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
python 美化输出信息的实例
2018/10/15 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
城市规划毕业生求职信
2013/10/10 职场文书
书法培训心得体会
2014/01/05 职场文书
婚假请假条怎么写
2014/04/10 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
Python源码解析之List
2021/05/21 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript