总结python实现父类调用两种方法的不同


Posted in Python onJanuary 15, 2017

python中有两种方法可以调用父类的方法:

super(Child, self).method(args)

 Parent.method(self, args)

我用其中的一种报了如下错误:

总结python实现父类调用两种方法的不同

找不到 classobj。当我把调用改为 super(B, self).f(name) 就能正确运行,且结果正确。

分析错误

因为基类没有继承 object , 在python中,一个可以这样创建:

class A:
 pass

也可以这样创建:

class A(object):
 pass

这两者的区别就是:

总结python实现父类调用两种方法的不同

这是老式类(前者)和新式类(后者)的区别。区别可以参考:https://docs.python.org/release/2.5.2/ref/node33.html

python3已经把旧类型去掉了,也就是说已经隐式继承了object,所以,python3中写不写继承object都是没有区别的

两种调用的区别

Parent.__init__(self) super(Child, self).__init__() 的区别是什么?

super 理解成父类也是理所当然,python里其实指的是 MRO 中的下一个类!

super其实干了这件事,看这个答案:

def super(cls, inst):
 mro = inst.__class__.mro() # Always the most derived class
 return mro[mro.index(cls) + 1]

MRO 全称 Method Resolution Order,它代表了类继承的顺序。

super 是用来解决多重继承问题的,假设B C D 都是直接继承class A

class E(B, C, D):
 def __init__(self):
  # code...

如果E类的构造函数使用 super(E, self).__init__() 时,A类的构造函数会被执行一次,而用另一种方法,A类的构造函数会被执行多次。

在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。

总结

个人觉得,复杂的继承结构是设计中不良的设计,当继承结构清晰后,两个方法其实就没什么区别了。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助。

Python 相关文章推荐
python之yield表达式学习
Sep 02 Python
Windows8下安装Python的BeautifulSoup
Jan 22 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
python中实现k-means聚类算法详解
Nov 11 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
Python3 log10()函数简单用法
Feb 19 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
python代码xml转txt实例
Mar 10 Python
python logging 重复写日志问题解决办法详解
Aug 04 Python
Python切片列表字符串如何实现切换
Aug 06 Python
利用python程序帮大家清理windows垃圾
Jan 15 #Python
Python科学计算之NumPy入门教程
Jan 15 #Python
Python科学计算之Pandas详解
Jan 15 #Python
使用pyecharts无法import Bar的解决方案
Apr 23 #Python
详解Python3中字符串中的数字提取方法
Jan 14 #Python
win7上python2.7连接mysql数据库的方法
Jan 14 #Python
python实现字符串连接的三种方法及其效率、适用场景详解
Jan 13 #Python
You might like
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
原生JS实现随机点名项目的实例代码
2019/04/30 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python探索之SocketServer详解
2017/10/28 Python
python执行精确的小数计算方法
2019/01/21 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python中time库的实例使用方法
2019/10/31 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
python 实现音频叠加的示例
2020/10/29 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
柏林通行证:Berlin Pass
2018/04/11 全球购物
国贸专业个人求职信范文
2014/01/08 职场文书
广告语设计及教案
2014/03/21 职场文书
计划生育宣传标语
2014/06/21 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
企业催款函范本
2015/06/24 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
MySQL数据库事务的四大特性
2022/04/20 MySQL