总结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实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
使用Python编写一个模仿CPU工作的程序
Apr 16 Python
python difflib模块示例讲解
Sep 13 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
一百行python代码将图片转成字符画
Feb 19 Python
python列表使用实现名字管理系统
Jan 30 Python
Python配置虚拟环境图文步骤
May 20 Python
Python跳出多重循环的方法示例
Jul 03 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
Django返回HTML文件的实现方法
Sep 17 Python
python 经纬度求两点距离、三点面积操作
Jun 03 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目录导航文件代码
2006/10/09 PHP
与数据库连接
2006/10/09 PHP
php去除HTML标签实例
2013/11/06 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
Javascript 二维数组
2009/11/26 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
简单了解什么是神经网络
2017/12/23 Python
Python语言的变量认识及操作方法
2018/02/11 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
Python实战购物车项目的实现参考
2019/02/20 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
Java基础类库面试题
2013/09/04 面试题
商务英语求职自荐信范文
2013/12/24 职场文书
团日活动总结书格式
2014/05/08 职场文书
办公用房租赁协议书
2014/11/29 职场文书
银行自荐信范文
2015/03/25 职场文书
学校捐书倡议书
2015/04/27 职场文书
歼十出击观后感
2015/06/11 职场文书