总结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网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
Python使用MD5加密字符串示例
Aug 22 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python+Wordpress制作小说站
Apr 14 Python
django定期执行任务(实例讲解)
Nov 03 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python自定义时钟类、定时任务类
Feb 22 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
python中turtle库的简单使用教程
Nov 11 Python
python_tkinter事件类型详情
Mar 20 Python
python通过新建环境安装tfx的问题
May 20 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字符串处理的10个简单方法
2010/06/30 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
TensorFlow实现创建分类器
2018/02/06 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
政治学专业毕业生求职信
2014/08/11 职场文书
思想工作总结范文
2015/08/12 职场文书
中学教师教学工作总结
2015/08/13 职场文书
教师培训学习心得体会
2016/01/21 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL