总结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 相关文章推荐
web.py 十分钟创建简易博客实现代码
Apr 22 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
python调用百度语音识别api
Aug 30 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
python函数不定长参数使用方法解析
Dec 14 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
tensorflow 环境变量设置方式
Feb 06 Python
基于Pytorch SSD模型分析
Feb 18 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 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
Terran剧情介绍
2020/03/14 星际争霸
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
vue如何判断dom的class
2018/04/26 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Vue动态获取width的方法
2018/08/22 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
详解python while 函数及while和for的区别
2018/09/07 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
Windows和Linux动态库应用异同
2016/04/17 面试题
信息管理应届生求职信
2014/03/07 职场文书
亲属关系公证书
2014/04/08 职场文书
美食节策划方案
2014/05/26 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书