总结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中的循环语句的用法
Apr 09 Python
在python中bool函数的取值方法
Nov 01 Python
对python中xlsx,csv以及json文件的相互转化方法详解
Dec 25 Python
python批量修改文件夹及其子文件夹下的文件内容
Mar 15 Python
详解python使用turtle库来画一朵花
Mar 21 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
关于python中导入文件到list的问题
Oct 31 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中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
php mail to 配置详解
2014/01/16 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
如何通过python实现全排列
2020/02/11 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
期中考试后的反思
2014/02/08 职场文书
舞蹈教育学专业求职信
2014/06/29 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
初中班主任教育随笔
2015/08/15 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
导游词之舟山普陀山
2019/11/06 职场文书