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 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
Python实现的Google IP 可用性检测脚本
Apr 23 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
python简单获取数组元素个数的方法
Jul 13 Python
python实现中文转换url编码的方法
Jun 14 Python
python实现发送邮件功能代码
Dec 14 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
浅谈盘点5种基于Python生成的个性化语音方法
Feb 05 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上传中文文件名乱码问题处理方案
2015/02/03 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
node.js操作mysql简单实例
2017/05/25 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python 显示数组全部元素的方法
2018/04/19 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
Python 实现进度条的六种方式
2021/01/06 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
J2EE中的容器都包括哪些
2013/08/21 面试题
旅游项目开发策划书
2014/01/18 职场文书
军人违纪检讨书
2014/02/04 职场文书
毕业生对母校寄语
2015/02/26 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
大学军训通讯稿
2015/07/18 职场文书