总结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检测服务器是否正常
Feb 16 Python
跟老齐学Python之Python文档
Oct 10 Python
Python获取Windows或Linux主机名称通用函数分享
Nov 22 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
深入理解Python3中的http.client模块
Mar 29 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
Python调用shell命令常用方法(4种)
May 11 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 Python
Django xadmin安装及使用详解
Oct 26 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 Python
Elasticsearch 聚合查询和排序
Apr 19 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
一个ftp类(ini.php)
2006/10/09 PHP
一段php加密解密的代码
2007/07/16 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
33个Python爬虫项目实战(推荐)
2019/07/08 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
Python包和模块的分发详细介绍
2020/06/19 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
农场厂长岗位职责
2013/12/28 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
基层工作经验证明样本
2014/11/16 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
老公出轨后的保证书
2015/05/08 职场文书
主婚人致辞精选
2015/07/28 职场文书
详解python网络进程
2021/06/15 Python