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 相关文章推荐
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
Python简单实现控制电脑的方法
Jan 22 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
Mar 05 Python
多个应用共存的Django配置方法
May 30 Python
python 定时器,轮询定时器的实例
Feb 20 Python
pyqt5实现登录界面的模板
May 30 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
PyTorch实现AlexNet示例
Jan 14 Python
python输出第n个默尼森数的实现示例
Mar 08 Python
Python如何在windows环境安装pip及rarfile
Jun 15 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 无限级 SelectTree 类
2009/05/19 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
JS与C#编码解码
2013/12/03 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
Javascript学习指南
2014/12/01 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
2014年小班元旦活动方案
2014/02/16 职场文书
学校课外活动总结
2014/05/08 职场文书
村委会贫困证明范文
2014/09/21 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
JS的深浅复制详细
2021/10/16 Javascript
python中的sys模块和os模块
2022/03/20 Python
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android