深入理解Python中的super()方法


Posted in Python onNovember 20, 2017

前言

python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现

python语言与C++有相似的类继承,在类定义时,python中会自定义第一个self,类似C++中this指针,指向对象自身。

python简单的类举例:

>>> class hello(object): 
...     def print_c(): 
...       print"hello world!" 
>>> hello().print_c() 
hello world!

当然在实际中不可避免的需要类的继承,子类继承父类,正常如下:

>>> class child(hello): 
...     def print_c(self): 
...         hello().print_c() 
...          
>>> child().print_c() 
hello world!

在python中还提供了super()机制,例子如下:

>>> class hello(object): 
...     def print_c(self): 
...       print"hello world!" 
...        
>>> class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
>>> child().print_c() 
hello world!

注意

Python2.2以前的版本:经典类(classic class)时代

经典类是一种没有继承的类,实例类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会返回这样的错误 '''TypeError: must be type, not classobj'''

这时MRO的方法为DFS(深度优先搜索(子节点顺序:从左到右))。所以本文中使用的是新式类,而新式类的搜索算法是C3算法

class C(object):
 def minus(self,x):
  return x/2

class D(C):
 def minus(self,x):
  super(D, self).minus()
  print 'hello'

上面的代码中C是父类,D是子类,我们在D类重新定义了minus方法,就是在C类的功能基础基础上新添print 'hello'功能。super在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用super()的用法。那么问题来了

class A(object):
 def __init__(self):
  self.n = 10

 def minus(self, m):
  self.n -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=B()
b.minus(2)
print b.n

那么上面的代码中b.n的输出是什么呢?为什么结果是2呢,而不是5呢?super(B,self).minus(m)明明是调用了父类的minus方法,可是输出结果就是2,是你要明白现在B的实例,而不是A的实例,那么传递的self.n的数值是7,而不是10.

那么对于多继承的时候,super又是怎样工作的呢?来,现在创建一个继承A的C类,然后再创建一个继承B,C的D类,看看怎样调用super是重写方法。

class C(A):
 def __init__(self):
  self.n = 12

 def minus(self, m):
  super(C,self).minus(m)
  self.n -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

如上的代码输出的结果是什么呢?别心急,先看看它是怎样运行的。上面提及到新式类寻找子节点时候使用的是C3算法。那么它是怎么找呢。D->B->C->A->object。怎样才能验证这个顺序是对的呢。

D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

Mro是什么呢?对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表,它代表了类继承的顺序。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python文件与目录操作实例详解
Feb 22 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python 基础教程之闭包的使用方法
Sep 29 Python
Python实现Kmeans聚类算法
Jun 10 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python中super函数用法实例分析
Mar 18 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
python实现读取excel写入mysql的小工具详解
Nov 20 #Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 #Python
python Matplotlib画图之调整字体大小的示例
Nov 20 #Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 #Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 #Python
python中urlparse模块介绍与使用示例
Nov 19 #Python
Python Flask-web表单使用详解
Nov 18 #Python
You might like
PHP 已经成熟
2006/12/04 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php实现paypal 授权登录
2015/05/28 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
文字垂直滚动之javascript代码
2015/07/29 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
树结构之JavaScript
2017/01/24 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
教你学会使用Python正则表达式
2017/09/07 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Python 3 判断2个字典相同
2019/08/06 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
个人授权委托书模板
2014/09/14 职场文书
经费申请报告
2015/05/15 职场文书
2016年母亲节广告语
2016/01/28 职场文书
详解python的异常捕获
2022/03/03 Python
Python简易开发之制作计算器
2022/04/28 Python