总结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的网络编程库Gevent的安装及使用技巧
Jun 24 Python
python logging 日志轮转文件不删除问题的解决方法
Aug 02 Python
python实现分页效果
Oct 25 Python
Python遍历pandas数据方法总结
Feb 09 Python
python3的输入方式及多组输入方法
Oct 17 Python
如何使用Python 打印各种三角形
Jun 28 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
python新手学习可变和不可变对象
Jun 11 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
smarty简单入门实例
2014/11/28 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
php修改数组键名的方法示例
2017/04/15 PHP
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Python中字符串的处理技巧分享
2016/09/17 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
python爬虫实例详解
2018/06/19 Python
python实现多人聊天室
2020/03/31 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
Django继承自带user表并重写的例子
2019/11/18 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python新手如何理解循环加载模块
2020/05/29 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
自我评价的写作规则
2014/01/06 职场文书
室内拓展活动方案
2014/02/13 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
高中校园广播稿
2014/10/21 职场文书
社区综治工作汇报
2014/10/27 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
大学生自我评价范文
2015/03/03 职场文书
2015年工商所工作总结
2015/05/21 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
会计专业自荐信范文
2019/05/22 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python