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的Tornado框架异步编程入门实例
Apr 24 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
Python绘制频率分布直方图的示例
Jul 08 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
Nov 29 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
php 清除网页病毒的方法
2008/12/05 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
Python实现选择排序
2017/06/04 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
python中return如何写
2020/06/18 Python
Django返回HTML文件的实现方法
2020/09/17 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
瑞士国际航空官网:SWISS
2016/07/21 全球购物
学校安全教育制度
2014/01/31 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
门市房租房协议书
2014/12/04 职场文书
活动总结书怎么写
2015/05/11 职场文书
经典爱情感言
2015/08/03 职场文书
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript