深入理解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 05 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
python 对字典按照value进行排序的方法
May 09 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
Python面向对象之类的封装操作示例
Jun 08 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
关于Django Models CharField 参数说明
Mar 31 Python
5款实用的python 工具推荐
Oct 13 Python
python 基于opencv实现图像增强
Dec 23 Python
python爬取新闻门户网站的示例
Apr 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将向Java靠拢
2006/10/09 PHP
PHP Socket 编程
2010/04/09 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php生成验证码函数
2015/10/20 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
vue  directive定义全局和局部指令及指令简写
2018/11/20 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Python 常用string函数详解
2016/05/30 Python
python读写配置文件操作示例
2019/07/03 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
keras导入weights方式
2020/06/12 Python
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
学生犯错保证书
2015/05/09 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python