深入理解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中的Django框架中进行字符串翻译
Jul 27 Python
详解python时间模块中的datetime模块
Jan 13 Python
详解Django之auth模块(用户认证)
Apr 17 Python
Django实现表单验证
Sep 08 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
python安装scipy的方法步骤
Jun 26 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
使用Python实现分别输出每个数组
Dec 06 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+MySQL插入操作实例
2015/01/21 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
Redis构建分布式锁
2017/03/28 PHP
JavaScript 学习技巧
2010/02/17 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
shiro授权的实现原理
2017/09/21 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python迭代器与生成器用法实例分析
2018/07/09 Python
基于python中theano库的线性回归
2018/08/31 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
在求职信中如何凸显个人优势
2013/10/30 职场文书
会议邀请函范文
2014/01/09 职场文书
高一政治教学反思
2014/01/28 职场文书
寄语是什么意思
2014/04/10 职场文书
主题教育活动总结
2014/05/05 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
公司地址变更通知
2015/04/25 职场文书
航班延误投诉信
2015/07/02 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
Python+Appium新手教程
2021/04/17 Python
教你用eclipse连接mysql数据库
2021/04/22 MySQL
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python