Python实现子类调用父类的初始化实例


Posted in Python onMarch 12, 2020

前言

python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__方法重写了父类的__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。

例如以下的代码:

class A(object):
 def __init__(self):
  self.a = 5

 def function_a(self):
  print('I am from A, my value is %d' % self.a)


class B(A):
 def __init__(self):
  self.b = 10

 def function_b(self):
 print('I am from B, my value is %d' % self.b)
  self.function_a() # 调用类A的方法,出错


if __name__ == '__main__':
 b = B()
 b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

这时候就需要在类B的__init__方法中先执行类A的__init__方法,脚本才可以正确执行。Python提供了两种方法来完成这个任务。

方法一: 调用未绑定的父类__init__方法

在类的方法定义时,首个参数均为self。当实例化这个类时,self就被自动绑定到当前的实例。绑定也就意味着这个实例的属性,方法都可以通过‘self.***的方式进行调用。但是如果通过类名直接调用类的方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定的实例上。也就是子类的实例上,在这里就是类B了。

所以这里所说的未绑定的父类__init__方法 就是指未绑定父类实例的父类__init__方法。

具体的代码如下:

class A(object):
 def __init__(self):
  self.a = 5

 def function_a(self):
  print('I am from A, my value is %d' % self.a)


class B(A):
 def __init__(self):
  A.__init__(self) # 此处修改了。如果类A的__init__方法需要传参,也需要传入对应的参数
  self.b = 10

 def function_b(self):
  print('I am from B, my value is %d' % self.b)
  self.function_a()



if __name__ == '__main__':
 b = B()
 b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

方法二:调用super函数

super函数是用于调用父类的一个方法,主要是用于解决多继承问题,避免多继承带来的一些问题,当然也可以用来解决单继承问题,调用父类的__init__方法了。

具体代码如下:

class A(object):
 def __init__(self):
  self.a = 5

 def function_a(self):
  print('I am from A, my value is %d' % self.a)


class B(A):
 def __init__(self):
  super(B, self).__init__() # 此处修改了
  self.b = 10

 def function_b(self):
  print('I am from B, my value is %d' % self.b)
  self.function_a()


if __name__ == '__main__':
 b = B()
 b.function_b()

执行结果如下:

Python实现子类调用父类的初始化实例

总结

两种方法各有优缺点,但都可以解决问题。

- 方法一简单直观,但面对多继承问题,只能多次调用每个父类的__init__方法

- 方法二不太直观,但可以解决多继承问题,会一次性的执行所有的父类的对应方法

所以实际使用时,按照自己的需要选择一个就行了。

以上这篇Python实现子类调用父类的初始化实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现全角半角转换的方法
Aug 18 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
opencv实现简单人脸识别
Feb 19 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
Django视图、传参和forms验证操作
Jul 15 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
利用python做数据拟合详情
Nov 17 Python
Python绘画好看的星空图
Mar 17 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 #Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 #Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 #Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 #Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 #Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 #Python
Python获取对象属性的几种方式小结
Mar 12 #Python
You might like
用PHP读取RSS feed的代码
2008/08/01 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
yii添删改查实例
2015/11/16 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
常用的js方法合集
2017/03/10 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python list语法学习(带例子)
2013/11/01 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python的命名规则知识点总结
2019/10/04 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
2015年考研复习计划
2015/01/19 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js