总结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随机生成一个6位的验证码代码分享
Mar 24 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 Python
Python中使用ElementTree解析XML示例
Jun 02 Python
Django的分页器实例(paginator)
Dec 01 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
python调用百度REST API实现语音识别
Aug 30 Python
pandas 将索引值相加的方法
Nov 15 Python
python监控nginx端口和进程状态
Sep 06 Python
python 读取、写入txt文件的示例
Sep 27 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
js解决movebox移动问题
2016/03/29 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python的函数的一些高阶特性
2015/04/27 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Python 代码调试技巧示例代码
2020/08/11 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
python实现简单猜单词游戏
2020/12/24 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
大专生的学习自我评价
2013/12/04 职场文书
会计自荐信范文
2014/03/09 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
javascript实现计算器功能详解流程
2021/11/01 Javascript