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生成器(Generator)详解
Apr 13 Python
JSON Web Tokens的实现原理
Apr 02 Python
Python微信公众号开发平台
Jan 25 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
Python控制Firefox方法总结
Jun 03 Python
简单了解django索引的相关知识
Jul 17 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 Python
python常量折叠基础知识点讲解
Feb 28 Python
Python字典的基础操作
Nov 01 Python
Python os和os.path模块详情
Apr 02 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使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
JS跨域代码片段
2012/08/30 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
详解JS模块导入导出
2017/12/20 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
详细解读Python中的__init__()方法
2015/05/02 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
校长岗位职责
2013/11/26 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
班组拓展活动方案
2014/08/14 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js