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群发邮件实例代码
Jan 03 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python中functools模块的常用函数解析
Jun 30 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
不可错过的十本Python好书
Jul 06 Python
详解python字节码
Feb 07 Python
基于python中theano库的线性回归
Aug 31 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Python获取一个用户名的组ID过程解析
Sep 03 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
部署Django到阿里云服务器教程示例
Jun 03 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
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
如何用Django处理gzip数据流
2021/01/29 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
九年级体育教学反思
2014/01/23 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
机关出纳岗位职责
2014/04/03 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
总经理司机岗位职责
2015/04/10 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
基层工作经历证明
2015/06/19 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫