总结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 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
python中bytes和str类型的区别
Oct 21 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
Python 日期与时间转换的方法
Aug 01 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
利用python实现后端写网页(flask框架)
Feb 28 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
Python list列表删除元素的4种方法
Nov 01 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下载CSS文件中的图片的代码
2013/09/24 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
JS实现self的resend
2010/07/22 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
vue-model实现简易计算器
2020/08/17 Javascript
详解Python中的Cookie模块使用
2015/07/06 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Python列表切片常用操作实例解析
2019/12/16 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
非常详细的C#面试题集
2016/07/13 面试题
单位实习证明怎么写
2014/01/17 职场文书
员工评语大全
2014/01/19 职场文书
年会活动策划方案
2014/01/23 职场文书
护士自我评价范文
2014/01/25 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
道德之星事迹材料
2014/05/03 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
运动会广播稿50字
2015/08/19 职场文书