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 FTP操作类代码分享
May 13 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
python爬虫实例详解
Jun 19 Python
对python for 文件指定行读写操作详解
Dec 29 Python
Python类的继承用法示例
Jan 31 Python
python 堆和优先队列的使用详解
Mar 05 Python
解决Mac下使用python的坑
Aug 13 Python
在python3中实现更新界面
Feb 21 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
详解python程序中的多任务
Sep 16 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
ES6 let和const定义变量与常量的应用实例分析
2019/06/27 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
使用npy转image图像并保存的实例
2020/07/01 Python
Python如何将字符串转换为日期
2020/07/31 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
python实现视频压缩功能
2020/12/18 Python
部队领导证婚词
2014/01/12 职场文书
会计岗位职责模板
2014/03/12 职场文书
总经理助理的职责
2014/03/14 职场文书
终止劳动合同协议书
2014/04/14 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
赔偿协议书
2015/01/27 职场文书
护士求职简历自我评价
2015/03/10 职场文书
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
浅谈如何保证Mysql主从一致
2022/03/13 MySQL