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新手实现2048小游戏
Mar 31 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
Python内置函数—vars的具体使用方法
Dec 04 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
Python读取csv文件实例解析
Dec 30 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
django API 中接口的互相调用实例
Apr 01 Python
教你用python控制安卓手机
May 13 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横向重复区域显示二法
2008/09/25 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
linux下python抓屏实现方法
2015/05/22 Python
python实现爬取图书封面
2018/07/05 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
英国手机零售商:Metrofone
2019/03/18 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
销售总监工作职责
2013/11/21 职场文书
农业资源与环境专业自荐信范文
2013/12/30 职场文书
医院检讨书范文
2014/02/01 职场文书
经典洗发水广告词
2014/03/13 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
Python中else的三种使用场景
2021/06/16 Python
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
volatile保证可见性及重排序方法
2022/08/05 Java/Android