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实现数组插入新元素的方法
May 22 Python
Python的迭代器和生成器
Jul 29 Python
python脚本设置系统时间的两种方法
Feb 21 Python
解决python opencv无法显示图片的问题
Oct 28 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
python 动态调用函数实例解析
Oct 21 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
Python timeit模块原理及使用方法
Oct 10 Python
Python3压缩和解压缩实现代码
Mar 01 Python
Python创建自己的加密货币的示例
Mar 01 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 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
ftp类(myftp.php)
2006/10/09 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
多广告投放代码 推荐
2006/11/13 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
Python struct.unpack
2008/09/06 Python
python实现的各种排序算法代码
2013/03/04 Python
Python 抓取动态网页内容方案详解
2014/12/25 Python
浅析python参数的知识点
2018/12/10 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android