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 socketserver框架全面解析
Sep 21 Python
django站点管理详解
Dec 12 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
Java文件与类动手动脑实例详解
Nov 10 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
Python的形参和实参使用方式
Dec 24 Python
Python中url标签使用知识点总结
Jan 16 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
python如何爬取动态网站
Sep 09 Python
Python引入多个模块及包的概念过程解析
Sep 21 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源代码
2013/06/26 PHP
php后门URL的防范
2013/11/12 PHP
提高php编程效率技巧
2015/08/13 PHP
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
附答案的Java面试题
2012/11/19 面试题
网上签名寄语活动留言
2014/01/18 职场文书
网站推广策划方案
2014/06/04 职场文书
三好学生个人总结
2015/02/15 职场文书
小学科学课教学反思
2016/02/23 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
Java 多态分析
2022/04/26 Java/Android