当继承的时候遇到这种情况:定义一个类,多个类继承了这个类,接着再定义一个类,他继承了这多个类。

如:

类1

类2(类1)   类3(类1)  类4(类1)  ....................................

类(类2,类3, 类4......................)

此时调用第三个类创建对象时,要想每个类的构造方法都被执行,有两种方法:

①在子类中使用父类.__init__(self, 参数)来强行再如父类的构造函数。

②使用super()方法

当使用①时,此时遇到一个问题,那就是父类的构造方法可能多次重复执行,造成资源浪费。例如:

class Father(object):def __init__(self, name):self.name = nameprint('father')class Son1(Father):def __init__(self, name, age):self.age = ageFather.__init__(self, name)print('Son1')class Son2(Father):def __init__(self, name, gender):self.gender = genderFather.__init__(self, name)print('Son2')class Grandson(Son1, Son2):def __init__(self, name, age, gender):Son1.__init__(self, name, age)Son2.__init__(self, name, gender)grand_son = Grandson('鬼子', 14, '男')

结果:

father
Son1
father

Son2

可见Father类的构造方法被执行了两次。此时用②super()方法来解决

②super()

class Mother(object):def __init__(self, name):print('Mother')self.name = nameclass Daughter1(Mother):def __init__(self, name, age, *args):print('Daughter1')self.age = agesuper(Daughter1, self).__init__(name, *args)class Daughter2(Mother):def __init__(self, name, gender):print('Daughter2')self.gender = gendersuper(Daughter2, self).__init__(name)class Granddaughter(Daughter1, Daughter2):def __init__(self, name, age, gender):print('Granddaughter')super(Granddaughter, self).__init__(name, age, gender)granddaughter = Granddaughter('狗剩', 24, '女')

结果:

Granddaughter
Daughter1
Daughter2

Mother

解决!!!

首先super首先获取self这个对象所在的类

然后可以通过类名.__mro__方法实现该类的继承列表

最后找到下一个继承的类,执行他的构造方法,依此类推,直到列表的最后一个类

最后注意:当传参导致参数无法实现对齐时,使用*args,**kwargs来补齐

python面向对象3(钻石继承的问题,多继承的super用法)相关推荐

  1. Python面向对象设计:对象与类,继承————以大鱼吃小鱼为例

    前言 编写类时,并非总是要从空白开始.如果要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类 ...

  2. Python面向对象的三大特征(封装、继承、多态)

    一.封装 之前我们的属性和方法是分开定义的,属性就是属性,方法就是方法,对象可以使用类的属性,也可以使用类的方法,所以出现了调用对象属性都是一样的.现在我们为每个对象创建特有的属性,即属性也是变量,从 ...

  3. python——面向对象的三大特性:封装,继承,多态

    封装 封装为一个大类,类中包含属性和方法 将属性和方法封装到一个抽象的类中 外界使用类创建对象,然后让对象调用方法 对象方法的细节都封装在类的内部 例题: 需求 1.小明体重75.0公斤 2.小明每次 ...

  4. python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...

    本文实例讲述了Python面向对象程序设计之私有变量,私有方法原理与用法.分享给大家供大家参考,具体如下: 私有变量,私有方法:python的私有化是为了规划私有属性,避免非相关的访问[假如!我有老婆 ...

  5. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...

    本文实例讲述了Python面向对象程序设计类变量与成员变量.类方法与成员方法用法.分享给大家供大家参考,具体如下: 类变量与成员变量 在类中声明的变量我们称之为类变量[静态成员变量], 在init() ...

  6. Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...

    Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数) https://mubu.com/doc/1AqL_M0IbW 继承之钻石继承 多态 封装 几个装饰 ...

  7. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

  8. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  9. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  10. Python面向对象简单继承

    Python面向对象简单继承 python是面向对象的语言,它支持继承,即一个类可以继承父类那里属性和方法.本书代码源自<<Python 3 Object-Oriented Program ...

最新文章

  1. 自学python的书籍逐级推荐-近300本Python书籍到底哪家强,用Python告诉你
  2. Ubuntu显示隐藏文件和文件夹
  3. 学习旧岛小程序 (3)组件的样式
  4. Oralce数据库之存储过程、存储函数、触发器和数据字典
  5. 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  6. linux下编译libuv,linux下libuv库安装教程
  7. spark_spark连接hive config
  8. jssdk分享设置_JSSDK自定义分享
  9. DT大数据梦工厂 第55,56讲
  10. usbcan、can分析仪的产品特点和功能特点
  11. adobe photoshop cs4 注册码
  12. S3C2440-裸机篇-01 | JZ2440开发板快速上手
  13. 月入3万多的程序员回老家, 被亲戚说不如县城卖手机月入2千的表弟
  14. Classloader整理
  15. css3软键盘不盖住输入框的方法
  16. mysql table plugin,MySql报错Table mysql.plugin doesn’t exist的解决方法
  17. 怎么用python绘制柱状图_如何用python快速简单的制作柱状图?
  18. 半物理仿真系统——EPB HIL系统解决方案
  19. CSDN,我的良师益友
  20. 短信验证码的作用是什么?如何选择靠谱的短信验证码平台?

热门文章

  1. portainer连接swarm集群
  2. Windows10系统下swin-transformer目标检测环境搭建
  3. 爬虫+MySQL+flask+echarts数据可视化
  4. GStreamer 进阶
  5. https://blog.csdn.net/qq_28175337/article/details/47336777 ( KMP )
  6. 解决vmware卡死白屏问题
  7. isnumeric java_你知道ApacheCommon包中isNumeric方法是坑吗-百度经验
  8. 挥之不去的秋天的气息
  9. matlab 实现电话拨号
  10. 关于hmailserver代理的验证