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 10 Python
Python多线程爬虫简单示例
Mar 04 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
python程序变成软件的实操方法
Jun 24 Python
python getpass实现密文实例详解
Sep 24 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
Python itertools.product方法代码实例
Mar 27 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
pycharm 如何查看某一函数源码的快捷键
May 12 Python
如何理解python接口自动化之logging日志模块
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下过滤HTML代码的函数
2007/12/10 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
php报错502badgateway解决方法
2019/10/11 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
2014/10/11 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
NodeJs基本语法和类型
2015/02/13 NodeJs
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python中bisect模块用法实例
2014/09/25 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
python  logging日志打印过程解析
2019/10/22 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
生育关怀行动实施方案
2014/03/26 职场文书
感恩之星事迹材料
2014/05/03 职场文书
员工保密承诺书
2014/05/28 职场文书
导师工作推荐信
2015/03/27 职场文书
文员岗位职责范本
2015/04/16 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js