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 相关文章推荐
Pyhton中防止SQL注入的方法
Feb 05 Python
Python中自定义函数的教程
Apr 27 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 Python
分享vim python缩进等一些配置
Jul 02 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
python文本数据处理学习笔记详解
Jun 17 Python
Python代码块及缓存机制原理详解
Dec 13 Python
Python class的继承方法代码实例
Feb 14 Python
Django 后台带有字典的列表数据与页面js交互实例
Apr 03 Python
基于matplotlib xticks用法详解
Apr 16 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
python中的json总结
2018/10/11 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
Django视图扩展类知识点详解
2019/10/25 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
详解python itertools功能
2020/02/07 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
会计专业导师推荐信
2014/03/08 职场文书
售后服务承诺书范文
2014/03/26 职场文书
医院院务公开实施方案
2014/05/03 职场文书
优秀员工评优方案
2014/06/13 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
秋收起义观后感
2015/06/11 职场文书