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使用reportlab画图示例(含中文汉字)
Dec 03 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
基于Python实现用户管理系统
Feb 26 Python
10款最好的Python开发编辑器
Jul 03 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
python计算导数并绘图的实例
Feb 29 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
php中in_array函数用法分析
2014/11/15 PHP
PHP网络操作函数汇总
2015/05/18 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python实现淘宝秒杀脚本
2020/06/23 Python
在vscode中配置python环境过程解析
2019/09/28 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
护士在校生自荐信
2014/02/01 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
关于爱国的标语
2014/06/24 职场文书
灵魂歌王观后感
2015/06/17 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书