总结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实现针对中文排序的方法
May 09 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
python实现textrank关键词提取
Jun 22 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
python如何制作英文字典
Jun 25 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
Python实现AI换脸功能
Apr 10 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
PyTorch的torch.cat用法
Jun 28 Python
Python实现哲学家就餐问题实例代码
Nov 09 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 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
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
DOM精简教程
2006/10/03 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
解决Mac下使用python的坑
2019/08/13 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python图片合成的示例
2020/11/09 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
关于Java finally的面试题
2016/04/27 面试题
女大学生个人求职信
2013/12/09 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
义卖募捐活动总结
2015/05/09 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
MySQL创建管理RANGE分区
2022/04/13 MySQL