总结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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
讲解Python中的标识运算符
May 14 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
python版微信跳一跳游戏辅助
Jan 11 Python
tensorflow更改变量的值实例
Jul 30 Python
python redis 删除key脚本的实例
Feb 19 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
Python可以用来做什么
Nov 23 Python
python Timer 类使用介绍
Dec 28 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 表单提交给自己
2008/07/24 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
初婚未育证明
2014/01/15 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
场地使用证明模板
2014/10/25 职场文书
2014年护理部工作总结
2014/11/14 职场文书
商铺租房协议书范本
2014/12/04 职场文书
期末复习计划
2015/01/19 职场文书
个人年终总结开头
2015/03/06 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
Python开发五子棋小游戏
2022/04/28 Python