首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 19:21
  • 4087
  • 6044
blog.csdn.net

第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(使用时错误,后面赋值时是按百公里油耗赋值的,特此说明)。为了聚焦问题,在类内都只定义构造方法,超类的类定义如下:

  1. class Vehicle():
  2.    def __init__(self,wheelcount, power):
  3.        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)    子类定义如下:

  1. class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法
  2.     def __init__(self,wheelcount, power,oilcostperkm):
  3.         self.oilcostperkm = oilcostperkm
  4.         print("In Car __init__:oilcostperkm=",self.oilcostperkm)。

2)    定义实例

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

3)    查看实例数据

  1. car.__dict__ #查看实例自定义属性,应该只有oilcostperkm
  2. car.wheelcount #查看实例的    wheelcount,应报错

4)    案例截图:


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

4.    案例3:子类重写构造方法并调用父类构造方法
1)    子类定义如下:

  1. class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法
  2.     def __init__(self,wheelcount, power,oilcostperkm):
  3.         self.oilcostperkm = oilcostperkm
  4.         print("In Car __init__:oilcostperkm=",self.oilcostperkm)
  5.         super().__init__(wheelcount, power) 

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

  1. Vehicle.__init__(self,wheelcount, power)
  2. super(Car,self).__init__(wheelcount, power)

2)    定义实例和查看数据

  1. car=Car(4,'汽油发动机',10) #应该执行两个构造方法
  2. car.__dict__ #查看实例自定义属性,应该wheelcount, power,oilcostperkm都有
  3. car.wheelcount #查看实例的    wheelcount,应正常给出

3)    案例截图:


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

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


老猿Python(http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树基础语法类333596 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/93513097"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top