总结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的setuptools框架下生成egg的教程
Apr 13 Python
使用Python编写vim插件的简单示例
Apr 17 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
Python学习之包与模块详解
Mar 19 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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无限分类源码分享(思路不错)
2011/10/13 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
分享PHP守护进程类
2015/12/30 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python中字符串前面加r的作用
2015/06/04 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
通过shell+python实现企业微信预警
2019/03/07 Python
python打开使用的方法
2019/09/30 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
中专毕业个人的自荐信格式
2013/09/21 职场文书
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
经典优秀毕业生求职信范文分享
2013/12/18 职场文书
大学生暑期实践感言
2014/02/26 职场文书
客服专员岗位职责
2014/02/28 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
2014年财政所工作总结
2014/11/22 职场文书
国庆庆典邀请函
2015/02/02 职场文书
大学四年个人总结
2015/03/03 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Python简易开发之制作计算器
2022/04/28 Python