深入理解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的Tkinter实现一个简易计算器
Dec 31 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
基于python socketserver框架全面解析
Sep 21 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
对python周期性定时器的示例详解
Feb 19 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
Python基于numpy模块实现回归预测
May 14 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
Python基础之元组与文件知识总结
May 19 Python
Flask response响应的具体使用
Jul 15 Python
Python日志模块logging用法
Jun 05 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/13 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
Json解析的方法小结
2016/06/22 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
angular中如何绑定iframe中src的方法
2019/02/01 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
python判断完全平方数的方法
2018/11/13 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
如何在django中实现分页功能
2020/04/22 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
销售找工作求职信
2013/12/20 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
环境整治工作方案
2014/05/18 职场文书
优秀员工演讲稿
2014/05/19 职场文书
人代会标语
2014/06/30 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2015中秋祝酒词
2015/08/12 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android