深入理解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使用marshal模块序列化实例
Sep 25 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
Python使用OpenCV进行标定
May 08 Python
创建pycharm的自定义python模板方法
May 23 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
详解Python学习之安装pandas
Apr 16 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
Python类中self参数用法详解
Feb 13 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python如何把十进制数转换成ip地址
May 25 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/10/09 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
javascript cookies操作集合
2010/04/12 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
PHP7新特性简述
2017/06/11 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python实现无证书加密解密实例
2014/10/27 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Django 连接sql server数据库的方法
2018/06/30 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
附答案的Java面试题
2012/11/19 面试题
给上级领导的感谢信
2015/01/22 职场文书
亲戚关系证明
2015/06/24 职场文书
《静夜思》教学反思
2016/02/17 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS