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魔术方法详解
Feb 14 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
Dec 27 Python
Python编写一个闹钟功能
Jul 11 Python
浅谈python中的占位符
Nov 09 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
python的debug实用工具 pdb详解
Jul 12 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
numpy数据类型dtype转换实现
Apr 24 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
Python的Django框架中的数据库配置指南
2015/07/17 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
tensorflow获取变量维度信息
2018/03/10 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
德国PC硬件网站:CASEKING
2016/10/20 全球购物
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
网络程序员自荐信
2014/01/25 职场文书
房屋租房协议书范本
2014/12/04 职场文书
股权转让协议范本
2014/12/07 职场文书
如何写新闻稿
2015/07/18 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
Python实现为PDF去除水印的示例代码
2022/04/03 Python
vue使用watch监听属性变化
2022/04/30 Vue.js