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 相关文章推荐
python抓取豆瓣图片并自动保存示例学习
Jan 10 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
Python2.x与Python3.x的区别
Jan 14 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
python基础教程之分支、循环简单用法
Jun 16 Python
Python实现统计文本文件字数的方法
May 05 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
Flask处理Web表单的实现方法
Jan 31 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实现创建一个RPC服务操作示例
2020/02/23 PHP
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
python 解析html之BeautifulSoup
2009/07/07 Python
python列表与元组详解实例
2013/11/01 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
Python反射用法实例简析
2017/12/22 Python
浅述python2与python3的简单区别
2018/09/19 Python
python自动化生成IOS的图标
2018/11/13 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Jupyter加载文件的实现方法
2020/04/14 Python
Python 如何实现访问者模式
2020/07/28 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
和谐拯救危机观后感
2015/06/15 职场文书