总结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实现二分法算法实例
Feb 02 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
python绘制多个曲线的折线图
Mar 23 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
python调用动态链接库的基本过程详解
Jun 19 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
wxPython之wx.DC绘制形状
Nov 19 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
python 制作网站小说下载器
Feb 20 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
PHP音乐采集(部分代码)
2007/02/14 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
销售助理岗位职责
2014/02/21 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Python获取字典中某个key的value
2022/04/13 Python