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的Django REST框架中的序列化及请求和返回
Apr 11 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
学生信息管理系统python版
Oct 17 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
Python列表list常用内建函数实例小结
Oct 22 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
浅析Python __name__ 是什么
Jul 07 Python
Python pip install之SSL异常处理操作
Sep 03 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
如何在PHP中使用Oracle数据库(2)
2006/10/09 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
joomla数据库操作示例代码
2016/01/06 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
python 读写中文json的实例详解
2017/10/29 Python
一份python入门应该看的学习资料
2018/04/11 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
JAVA程序员面试题
2012/10/03 面试题
自荐书范文范例
2014/02/13 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
HR求职自荐信范文
2014/06/21 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
2015毕业寄语大全
2015/02/26 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL