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使用shelve模块实现简单数据存储的方法
May 20 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
PyQt5每天必学之布局管理
Apr 19 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 Python
python装饰器原理与用法深入详解
Dec 19 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
python os.rename实例用法详解
Dec 06 Python
Python3+Flask安装使用教程详解
Feb 16 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 Python
python实现黄金分割法的示例代码
Apr 28 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命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript比较文档位置
2008/04/08 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
大码女装:Ulla Popken
2019/08/06 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
存储过程的优点有哪些
2012/09/27 面试题
大学学生会竞选演讲稿
2014/04/25 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
委托培训协议书
2014/11/17 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
python游戏开发Pygame框架
2022/04/22 Python
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android