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实现扫描端口示例
Mar 29 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python循环语句中else的用法总结
Sep 11 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Python新手学习raise用法
Jun 03 Python
PyQt5-QDateEdit的简单使用操作
Jul 12 Python
Python如何实现感知器的逻辑电路
Dec 25 Python
Django中session进行权限管理的使用
Jul 09 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
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
打开电脑上的QQ的python代码
2013/02/10 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
python实现低通滤波器代码
2020/02/26 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
C++是不是类型安全的
2014/02/18 面试题
就业自荐信
2013/12/04 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
公司担保书范文
2014/05/21 职场文书
论文诚信承诺书
2014/05/23 职场文书
文秘应届生求职信
2014/07/05 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
祝酒词范文
2015/08/12 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题