Python中super的用法实例


Posted in Python onMay 28, 2015

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。

普通继承

class FooParent(object):  

    def __init__(self):  

        self.parent = 'I\'m the parent.'  

        print 'Parent'  

      

    def bar(self,message):  

        print message, 'from Parent'  

          

class FooChild(FooParent):  

    def __init__(self):  

        FooParent.__init__(self)  

        print 'Child'  

          

    def bar(self,message):  

        FooParent.bar(self,message)  

        print 'Child bar function.'  

        print self.parent  

          

if __name__=='__main__':  

    fooChild = FooChild()  

    fooChild.bar('HelloWorld') 

super继承

class FooParent(object):  

    def __init__(self):  

        self.parent = 'I\'m the parent.'  

        print 'Parent'  

      

    def bar(self,message):  

        print message,'from Parent'  

  

class FooChild(FooParent):  

    def __init__(self):  

        super(FooChild,self).__init__()  

        print 'Child'  

          

    def bar(self,message):  

        super(FooChild, self).bar(message)  

        print 'Child bar fuction'  

        print self.parent  

  

if __name__ == '__main__':  

    fooChild = FooChild()  

    fooChild.bar('HelloWorld') 

程序运行结果相同,为:

Parent

Child

HelloWorld from Parent

Child bar fuction

I'm the parent.

从运行结果上看,普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
注意super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

关于super用法的详细研究可参考「https://3water.com/article/66912.htm」

Python 相关文章推荐
利用python获得时间的实例说明
Mar 25 Python
python去掉字符串中重复字符的方法
Feb 27 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
Python实现图片转字符画的示例代码
Aug 21 Python
python实现学生信息管理系统
Apr 05 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
python中turtle库的简单使用教程
Nov 11 Python
python 获取计算机的网卡信息
Feb 18 Python
Python中的super用法详解
May 28 #Python
Python读写ini文件的方法
May 28 #Python
Python实现给文件添加内容及得到文件信息的方法
May 28 #Python
Python功能键的读取方法
May 28 #Python
python实现将文本转换成语音的方法
May 28 #Python
Python 26进制计算实现方法
May 28 #Python
Python中super关键字用法实例分析
May 28 #Python
You might like
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
PHP中常用的魔术方法
2017/04/28 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
对python中UDP,socket的使用详解
2019/08/22 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
小班重阳节活动方案
2014/02/08 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
python 实现体质指数BMI计算
2021/05/26 Python