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多进程分块读取超大文件的方法
Apr 13 Python
MySQL适配器PyMySQL详解
Sep 20 Python
python+opencv轮廓检测代码解析
Jan 05 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
python绘制趋势图的示例
Sep 17 Python
解决pytorch 模型复制的一些问题
Mar 03 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
js post方式传递提交的实现代码
2010/05/31 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
vue中轮训器的使用
2019/01/27 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Python实现批量检测HTTP服务的状态
2016/10/27 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
业务代表的岗位职责
2013/11/16 职场文书
初中生学习生活的自我评价
2013/11/20 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
2019 入党申请书范文
2019/07/10 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers