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中as用法实例分析
Apr 30 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
用python编写第一个IDA插件的实例
May 29 Python
python实现音乐下载的统计
Jun 20 Python
python 除法保留两位小数点的方法
Jul 16 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
Django多数据库的实现过程详解
Aug 01 Python
python字符串下标与切片及使用方法
Feb 13 Python
python线程池如何使用
May 28 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
Jan 06 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
如何利用python实现Simhash算法
Jun 28 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
类的另类用法--数据的封装
2006/10/09 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
PHP分享图片的生成方法
2018/04/25 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
canvas实现图像放大镜
2017/02/06 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
在keras中实现查看其训练loss值
2020/06/16 Python
Python学习之time模块的基本使用
2021/01/17 Python
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
工厂厂长的职责
2013/12/12 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
安全生产月活动总结
2014/05/04 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
感谢信格式范文
2015/01/22 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis