Python实现子类调用父类的方法


Posted in Python onNovember 10, 2014

本文实例讲述了Python实现子类调用父类的方法。分享给大家供大家参考。具体实现方法如下:

python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找。

继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的。

子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题
如果子类和父类都有构造函数,子类其实是重写了父类的构造函数,如果不显式调用父类构造函数,父类的构造函数就不会被执行,导致子类实例访问父类初始化方法中初始的变量就会出现问题。

先来看看如下示例:

class A:

    def __init__(self):

        self.namea="aaa"

    def funca(self):

        print "function a : %s"%self.namea

class B(A):

    def __init__(self):

        self.nameb="bbb"

    def funcb(self):

        print "function b : %s"%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

运行结果:
bbb
function b : bbb

Traceback (most recent call last):

  File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 19, in <module>

    print b.funca()

  File "D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py", line 6, in funca

    print "function a : %s"%self.namea

AttributeError: B instance has no attribute 'namea'

在子类中,构造函数被重写,但新的构造方法没有任何关于初始化父类的namea属性的代码,为了达到预期的效果,子类的构造方法必须调用其父类的构造方法来进行基本的初始化。有两种方法能达到这个目的:调用超类构造方法的未绑定版本,或者使用super函数。

方法一:调用未绑定的超类构造方法

修改代码,多增一行:

class A:

    def __init__(self):

        self.namea="aaa"

    def funca(self):

        print "function a : %s"%self.namea

class B(A):

    def __init__(self):

        #这一行解决了问题

        A.__init__(self)

        self.nameb="bbb"

    def funcb(self):

        print "function b : %s"%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

如上有注释的一行解决了该问题,直接使用父类名称调用其构造函数即可。

这种方法叫做调用父类的未绑定的构造方法。在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(称为绑定方法)。但如果直接调用类的方法(比如A.__init),那么就没有实例会被绑定。这样就可以自由的提供需要的self参数,这种方法称为未绑定unbound方法。
通过将当前的实例作为self参数提供给未绑定方法,B类就能使用其父类构造方法的所有实现,从而namea变量被设置。

方法二:使用super函数

修改代码,这次需要增加在原来代码上增加2行:

#父类需要继承object对象

class A(object):

    def __init__(self):

        self.namea="aaa"

    def funca(self):

        print "function a : %s"%self.namea

class B(A):

    def __init__(self):

        #这一行解决问题

        super(B,self).__init__()

        self.nameb="bbb"

    def funcb(self):

        print "function b : %s"%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

如上有注释的为新增的代码,其中第一句让类A继承自object类,这样才能使用super函数,因为这是python的“新式类”支持的特性。当前的雷和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

super函数会返回一个super对象,这个对象负责进行方法解析,解析过程其会自动查找所有的父类以及父类的父类。

方法一更直观,方法二可以一次初始化所有超类

super函数比在超累中直接调用未绑定方法更直观,但是其最大的有点是如果子类继承了多个父类,它只需要使用一次super函数就可以。然而如果没有这个需求,直接使用A.__init__(self)更直观一些。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
python非递归全排列实现方法
Apr 10 Python
Python实现单词翻译功能
Jun 06 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
使用Python更换外网IP的方法
Jul 09 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
详解python:time模块用法
Mar 25 Python
django模板获取list中指定索引的值方式
May 14 Python
Selenium之模拟登录铁路12306的示例代码
Jul 31 Python
详解python3类型注释annotations实用案例
Jan 20 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 #Python
Python类的多重继承问题深入分析
Nov 09 #Python
python查询mysql中文乱码问题
Nov 09 #Python
python刷投票的脚本实现代码
Nov 08 #Python
Django静态资源URL STATIC_ROOT的配置方法
Nov 08 #Python
Python中的__new__与__init__魔术方法理解笔记
Nov 08 #Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 #Python
You might like
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python实现的批量下载RFC文档
2015/03/10 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
详解【python】str与json类型转换
2019/04/29 Python
Python 串口读写的实现方法
2019/06/12 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
linux面试题参考答案(10)
2016/10/26 面试题
社区安全检查制度
2014/02/03 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
小学教师自我评价
2015/03/04 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
医德医风学习心得体会
2016/01/25 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书