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实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
python多进程中的内存复制(实例讲解)
Jan 05 Python
python使用itchat实现手机控制电脑
Feb 22 Python
python实现寻找最长回文子序列的方法
Jun 02 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
python pandas时序处理相关功能详解
Jul 03 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
Python自然语言处理之切分算法详解
Apr 25 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
网页自动跳转代码收集
2009/09/27 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python OpenCV视频截取并保存实现代码
2019/11/30 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
Linux的主要特性
2014/10/06 面试题
电气工程和自动化自荐信范文
2013/12/25 职场文书
小区停车场管理制度
2014/01/27 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
学校标语口号大全
2015/12/26 职场文书
教师远程培训心得体会
2016/01/09 职场文书
Python中的socket网络模块介绍
2022/07/23 Python
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL