第8.3节Python类的__init__方法深入剖析:构造方法与继承详解

一、    引言

上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没有重写构造方法,Python将会给出默认的__init__方法。上述介绍适用于自定义类没有自定义父类的情况,如果自定义类是从其他自定义类派生的,又会怎样呢?

二、    构造方法与继承

为了保障相关逻辑的正确性,在子类重写构造方法时,必须调用超类(继承的类)的构造方法,否则可能无法正确地初始化对象。

1.    子类在构造方法处理时,可以有两种方法:

1>    继承后不重写构造方法,此时子类直接继承了父类的构造方法;

2>    重写父类构造方法,在子类的构造方法里显式地调用父类的构造方法,对调用执行的具体代码位置没有要求,可以在子类构造方法的开始部分、中间部分或结尾部分都可以,主要看业务逻辑有没有要求。

这两种方法都可以确保子类继承父类时构造方法的正确性。

2.    子类里显示调用父类的构造方法的三种实现方式

1>    父类名.父类构造方法,这种方法需要注意,self参数必须传给父类方法;

2>    super().父类构造方法,这种方法调用不需要也不能传递self参数,由Python自动传入;

3>    super(子类名,self).父类构造方法,这种方法调用也不需要传递self参数。

以上三种方法,老猿推荐大家使用第二种,一是使用简单,不需要给出父类名或子类名,也不需要self参数传递,二是程序修改简单,如果父类或子类名修改无需修改相关代码。不过这种方法只有Python3以后才支持。

三、    案例

1.    案例说明:

本节使用一个继承案例,超类为Vehicle(车),子类为car(小汽车),车只有3个实例变量:wheelcount(轮子数)、power(动力)、行驶总里程totaldistance,子类根据情况不同会有不同的实例变量,最多增加一个实例变量每公里油耗oilcostperkm(使用时错误,后面赋值时是按百公里油耗赋值的,特此说明)。为了聚焦问题,在类内都只定义构造方法,超类的类定义如下:

class Vehicle():

def __init__(self,wheelcount, power):

self.wheelcount,self.power,self.totaldistance = wheelcount,power,0

2.    案例1:子类不重写构造方法

1)    子类定义如下:

class Car(Vehicle):pass

此时应该继承父类的构造方法。

2)    没有写构造方法,不带参数执行实例定义,系统应报错

car=Car()

3)    按父类要求定义实例

car=Car(4,'汽油发动机') #带正确参数执行

4)    案例截图:

5)    案例总结:

子类继承父类构造方法,执行实例定义时直接执行该构造方法。

3.    案例2:子类重写构造方法但子类构造方法中不调用父类构造方法

1)    子类定义如下:

class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法

def __init__(self,wheelcount, power,oilcostperkm):

self.oilcostperkm = oilcostperkm

print("In Car __init__:oilcostperkm=",self.oilcostperkm)。

2)    定义实例

car=Car(4,'汽油发动机',10)

3)    查看实例数据

car.__dict__ #查看实例自定义属性,应该只有oilcostperkm

car.wheelcount #查看实例的    wheelcount,应报错

4)    案例截图:

5)    案例总结:

子类重写构造方法,如果没有显示调用父类构造方法,则不会执行父类构造方法的相关代码。

4.    案例3:子类重写构造方法并调用父类构造方法

1)    子类定义如下:

class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法

def __init__(self,wheelcount, power,oilcostperkm):

self.oilcostperkm = oilcostperkm

print("In Car __init__:oilcostperkm=",self.oilcostperkm)

super().__init__(wheelcount, power)

调用父类的构造方法,本例中用的这是一种老猿推荐的调用方法,还可以有下面两种调用方法:

Vehicle.__init__(self,wheelcount, power)

super(Car,self).__init__(wheelcount, power)

2)    定义实例和查看数据

car=Car(4,'汽油发动机',10) #应该执行两个构造方法

car.__dict__ #查看实例自定义属性,应该wheelcount, power,oilcostperkm都有

car.wheelcount #查看实例的    wheelcount,应正常给出

3)    案例截图:

4)    案例总结:子类重写构造方法,显示调用父类构造方法,相关实例变量都会正常初始化。

本节结合案例详细介绍了在继承情况下应该怎么实现子类的构造方法,内容比较简单但很重要,请大家注意。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...相关推荐

  1. python正则怎么取反_第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反...

    一.引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩展 ...

  2. python在采购中应用_实例13:用Python批量查询采购物料交期及实际收货日期

    我们在实例10中介绍了工程部采购物料用于新产品开发,如何从杂乱的备注栏获取工程采购单号.获取到采购单号,只是第一步,随后还需要查询物料的交期和实际收货日期. 对于负责物料跟进的员工,每个新产品开发订单 ...

  3. python包的中 _init _.py文件介绍

    python包的中 _init _.py文件介绍 我们新建python包时常常会看到一个__init _.py文件. 作用介绍: ​ 一:这个文件是属于python包的,这个文件用作于标识python ...

  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  5. 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了

    摘自:https://mp.weixin.qq.com/s/OZnnuA31tEaVt0vnDOy5hQ 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了 原创 小翼 飞思实验室 今天 基 ...

  6. devexpress 中的checkboxlist怎么设置间距_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解

    本篇文章主要为大家讲解了html中的h1标签的样式解析,但是如果不用css样式来做的话,那就只能在html4.01中显示了,所以我们还是尽快学习css层叠样式表吧,好了,现在让我们来说说这篇文章吧. ...

  7. qt怎么设置标签背景图片_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解...

    本篇文章主要为大家讲解了html中的h1标签的样式解析,但是如果不用css样式来做的话,那就只能在html4.01中显示了,所以我们还是尽快学习css层叠样式表吧,好了,现在让我们来说说这篇文章吧. ...

  8. python __repr__方法_第8.13节 Python类中内置方法__repr__详解

    当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...

  9. python执行txt中代码_【技术分享】文件解压之过 Python中的代码执行

    预估稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 一.前言 Python中负责解压压缩文件的代码实现上并不安全,存在目录遍历漏洞,攻击者可以利用该漏洞覆盖_ ...

最新文章

  1. 把一台Cisco路由器配置为帧中继交换机
  2. shell的嵌入命令大全
  3. 书评 —— 深入网站开发和运营
  4. bigswitch公司
  5. php文件代码采用UTF-8编码的BOM问题---转自CSDN---十方地藏---http://blog.csdn.net/webdesman...
  6. 【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)...
  7. 开始学习jQuery和准备工作
  8. SQL Server 2008 R2:error 26 开启远程连接详解
  9. HTML的快速写法:Emmet和Haml
  10. 利用反射实现工厂模式
  11. java摆渡人,视频丨越野怪兽 JAVA 摆渡人(ANIMA)山地车
  12. win10恢复经典开始菜单_打造个性化开始菜单,Win10 开始菜单任务栏美化增强软件...
  13. 山东省非计算机专业,山东省高校非计算机专业教学考试(选择、判断含答案)2...
  14. 设备、设备控制器与驱动程序
  15. 《结构思考力》- 书摘整理
  16. ElementUI之el-pagination样式修改(小三角、“前往”、页码数)
  17. 性能测试有哪些我们测试员必须要掌握的知识点?
  18. 敲开bp神经网络之门(三,机器视觉斑点blob匹配中使用)
  19. 前端面试基础题总结 (必会)
  20. 转发 :QQ游戏百万人同时在线服务器架构实现

热门文章

  1. c语言汉字属于什么类型_狠准!你的名字属于什么类型 就是什么性格
  2. 2020-08-07 光纤通信第二章知识点整理
  3. 动态生成的html元素无法调用js函数,如何确保动态生成的div在js函数被调用之前被加载到DOM中?...
  4. 0基础怎么学python10010基础怎么学python_0基础学python全套python教程
  5. html5按钮样式具有子项目,如何使用HTML5+css3制作出12种常用的按钮开关样式(附完整代码)...
  6. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」
  7. centos开发环境安装的备忘
  8. C#循环语句(for循环)
  9. 获取linux服务器基本信息脚本
  10. 对PostgreSQL SPI例子的学习