深入理解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小技巧分享
Nov 22 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
详解Python中dict与set的使用
Aug 10 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
opencv python 2D直方图的示例代码
Jul 20 Python
在django admin中添加自定义视图的例子
Jul 26 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 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读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
跟老齐学Python之开始真正编程
2014/09/12 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python实现求特征选择的信息增益
2018/12/18 Python
python多线程同步实例教程
2019/08/11 Python
Python常用库大全及简要说明
2020/01/17 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
师范生实习的个人自我鉴定
2013/10/20 职场文书
安全员岗位职责
2013/11/11 职场文书
创意广告词
2014/03/17 职场文书
离婚协议书怎么写
2014/09/12 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js