python面向对象3(钻石继承的问题,多继承的super用法)
当继承的时候遇到这种情况:定义一个类,多个类继承了这个类,接着再定义一个类,他继承了这多个类。
如:
类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用法)相关推荐
- Python面向对象设计:对象与类,继承————以大鱼吃小鱼为例
前言 编写类时,并非总是要从空白开始.如果要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类 ...
- Python面向对象的三大特征(封装、继承、多态)
一.封装 之前我们的属性和方法是分开定义的,属性就是属性,方法就是方法,对象可以使用类的属性,也可以使用类的方法,所以出现了调用对象属性都是一样的.现在我们为每个对象创建特有的属性,即属性也是变量,从 ...
- python——面向对象的三大特性:封装,继承,多态
封装 封装为一个大类,类中包含属性和方法 将属性和方法封装到一个抽象的类中 外界使用类创建对象,然后让对象调用方法 对象方法的细节都封装在类的内部 例题: 需求 1.小明体重75.0公斤 2.小明每次 ...
- python定义私有变量的方法_Python面向对象程序设计之私有变量,私有方法原理与用法分析...
本文实例讲述了Python面向对象程序设计之私有变量,私有方法原理与用法.分享给大家供大家参考,具体如下: 私有变量,私有方法:python的私有化是为了规划私有属性,避免非相关的访问[假如!我有老婆 ...
- python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...
本文实例讲述了Python面向对象程序设计类变量与成员变量.类方法与成员方法用法.分享给大家供大家参考,具体如下: 类变量与成员变量 在类中声明的变量我们称之为类变量[静态成员变量], 在init() ...
- Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数)...
Python Day 21 面向对象 (面向对象的三大特性(二)继承,多态,封装,几个装饰器函数) https://mubu.com/doc/1AqL_M0IbW 继承之钻石继承 多态 封装 几个装饰 ...
- python面向对象编程 -- 封装、继承
面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...
- Python面向对象编程:类继承和其衍生术语
Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- Python面向对象简单继承
Python面向对象简单继承 python是面向对象的语言,它支持继承,即一个类可以继承父类那里属性和方法.本书代码源自<<Python 3 Object-Oriented Program ...
最新文章
- 自学python的书籍逐级推荐-近300本Python书籍到底哪家强,用Python告诉你
- Ubuntu显示隐藏文件和文件夹
- 学习旧岛小程序 (3)组件的样式
- Oralce数据库之存储过程、存储函数、触发器和数据字典
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- linux下编译libuv,linux下libuv库安装教程
- spark_spark连接hive config
- jssdk分享设置_JSSDK自定义分享
- DT大数据梦工厂 第55,56讲
- usbcan、can分析仪的产品特点和功能特点
- adobe photoshop cs4 注册码
- S3C2440-裸机篇-01 | JZ2440开发板快速上手
- 月入3万多的程序员回老家, 被亲戚说不如县城卖手机月入2千的表弟
- Classloader整理
- css3软键盘不盖住输入框的方法
- mysql table plugin,MySql报错Table mysql.plugin doesn’t exist的解决方法
- 怎么用python绘制柱状图_如何用python快速简单的制作柱状图?
- 半物理仿真系统——EPB HIL系统解决方案
- CSDN,我的良师益友
- 短信验证码的作用是什么?如何选择靠谱的短信验证码平台?
热门文章
- portainer连接swarm集群
- Windows10系统下swin-transformer目标检测环境搭建
- 爬虫+MySQL+flask+echarts数据可视化
- GStreamer 进阶
- https://blog.csdn.net/qq_28175337/article/details/47336777 ( KMP )
- 解决vmware卡死白屏问题
- isnumeric java_你知道ApacheCommon包中isNumeric方法是坑吗-百度经验
- 挥之不去的秋天的气息
- matlab 实现电话拨号
- 关于hmailserver代理的验证