Python super继承详解
来源:互联网 发布:js设置input可以编辑 编辑:程序博客网 时间:2024/04/30 10:19
MRO(Method resolution order)是python用来解析方法调用顺序的,mro中记录了一个类的所有基类的类类型序列,super不是简单地调用基类的方法,而是按照MRO中的顺序来调用类的方法。使用super()时,应该在所有类中使用,否则就可能发生有的类构造函数没有调用的情况。
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 class A(object): 4 def __init__(self): 5 print 'A __init__' 6 super(A, self).__init__() 7 print 'leave A' 8 class C(object): 9 def __init__(self):10 print 'C __init__'11 super(C, self).__init__()12 print 'leave C'13 class B(A,C):14 def __init__(self):15 print 'B __init__'16 super(B, self).__init__()17 print 'leave B'18 class D(B):19 def __init__(self):20 print 'D __init__'21 super(D, self).__init__()22 print 'leave D'23 if __name__ == '__main__':24 D()25 26 输出为:27 D __init__28 B __init__29 A __init__30 C __init__31 leave C32 leave A33 leave B34 leave D
编译过程:super(D,self)查找D的父类,根据广度优先算法依次查找super(类名,self)的父类。顺便说一下 经典类和新式类的区别?(1)在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A())(2) 新式类对象可以直接通过__class__属性获取自身类型:type(3)继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动(即广度优先搜索)。如下图所示:
mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类)。
之前查看了很多资料,说mro是基于深度优先搜索算法的。但不完全正确在Python2.3之前是基于此算法,但从Python2.3起应用了新算法:C3算法。
为什么采用C3算法
C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。
本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。
单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。
------------------------------新式类和旧式类中查找属性的顺序不同-------------------------------------
在新式类中,查找一个要调用的函数或者属性的时候,是广度优先搜搜的。
在旧式类当中,是深度优先搜索的。
0 0
- Python super继承详解
- python super 继承
- python中super()详解
- python普通继承和super继承
- python学习笔记(22)--类的详解4-多重继承(super()函数)
- python继承中super的问题
- Python 类继承,__bases__, __mro__, super
- Python 类继承,__bases__, __mro__, super
- 关于python的继承,super关键字
- Python 中的继承之Super用法
- Python 类继承,__bases__, __mro__, super
- Python学习:多继承和super()
- Python的多重继承和super
- Python中多继承与super()用法
- Python进阶-继承中的MRO与super
- python继承关系之super函数
- python的super详解(一)
- python的super详解(二)
- 欢迎使用CSDN-markdown编辑器
- 利用php和mysql实现注册登录页面
- Java堆、栈和常量池以及相关String的讲解
- 转:非构造函数的继承
- 《Java小游戏实现》:贪吃蛇
- Python super继承详解
- java 序列化内容分析
- StateList Drawable文件
- hdu5294(最短路+网络流)
- coreseek(sphinx)的简单应用以及在LAMP中的注意事项
- centos6.6简单搭建git服务端
- 关于FileOutputStream
- [BOI2007]摩基亚Mokia (cdq分治)
- Java面向对象 ----多态