总结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在Windows8下获取本机ip地址的方法
Mar 14 Python
Python中的字符串操作和编码Unicode详解
Jan 18 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
python梯度下降算法的实现
Feb 24 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
pandas抽取行列数据的几种方法
Dec 13 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JavaScript中“+=”的应用
2007/02/02 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
2019/09/04 Javascript
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
学校后勤岗位职责
2014/02/19 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
竞选班委演讲稿
2014/04/28 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
安全月宣传标语
2014/10/07 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
领导视察通讯稿
2015/07/18 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android