Python之super函数
来源:互联网 发布:java web用什么框架 编辑:程序博客网 时间:2024/06/02 13:55
在面向对象编程时,继承是必不可少的,而定义时往往需要在子类的一些操作时(如初始化等),除了处理自己的部分外,还需要调用基类的对应同名函数。在Python中有两种方法,一种是直接使用父类的类名,另一种是使用super函数,这两者间有什么区别呢?
其实对于正常的单继承来讲,两者之间是没有区别的,其区别在于多继承的菱形继承情况中,相当于C++中的虚继承场景。考虑如下示例代码,先看一下不使用super函数的场景:
class Base(): def __init__(self): print('Base')class A(Base): def __init__(self): print('A') Base.__init__(self)class B(Base): def __init__(self): print('B') Base.__init__(self)class C(A, B): def __init__(self): print('C') A.__init__(self) B.__init__(self)c= C()其结果显示如下:
>>> CABaseBBase可以看到其中的Base的初始化函数执行了2次,再换做super函数,代码如下
class Base(): def __init__(self): print('Base')class A(Base): def __init__(self): print('A') super(A, self).__init__()class B(Base): def __init__(self): print('B') super(B, self).__init__()class C(A, B): def __init__(self): print('C') super(C, self).__init__()c= C()其结果如下,可见Base的初始化函数只执行了一次。
>>> CABBasePython中的属性查找与类继承密切相关,其会依次在当前对象属性以及其父类中递归查找,其各个父类的顺序就相当重要。Python中采用一种MRO计算方法来对继承结构中的类进行排序(新类),通过属性__mro__可以查看每个类的继承顺序。
print(C.__mro__)(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>)而super函数也即是针对每个类的__mro__中查找对应的类的下一个类,其执行结果相当于如下代码:
class C(A, B): def __init__(self): print('C') #super(C, self).__init__() mro = self.__class__.__mro__ mro[mro.index(C)+1].__init__(self)因此在实际使用尽量使用super,特别注意不可两者方式混用。
PS:MRO算法
1)依据继承关系形成多条继承链;
2)从左到右依次选择链首的类,从中找出第一个满足如下条件的类:其不出现在其他链中,或者处于其他链的链头,将其加入到__mro__中,并在所有链中删除
3)然后重新执行过程2,直到类都已经加入到__mro__中;
针对示例中的类,其执行顺序如下:
1)形成两条链 [C, A, Base], [C, B, Base]
2)依次选择C, A, B, Base,最后形成__mro__
0 0
- Python之super函数
- python 之 super函数学习
- python继承关系之super函数
- Python super函数
- Python深入:super函数
- python-super函数
- Python-理解super函数
- python super()函数
- Python super() 函数
- python 关键字之super
- python中super函数用法
- python的super函数解析
- python的super函数示例
- python之super的问题
- Python之路--super关键字
- Python的build-in函数super()
- Python进阶(七):super()函数
- Python 中的继承之Super用法
- 求次方和
- eclipse中的web app libraries没有Jar包
- JAVA NIO 服务器(三)
- 【LEETCODE】275-H-Index II [Python]
- android Studio的简单设置和运行
- Python之super函数
- 心得
- 普通用户忘记密码,又没有设置root密码
- 网络测试常用的命令-比较ping,tracert和pathping等命令之间的关系
- 欢迎使用CSDN-markdown编辑器
- ContactsUI(修改联系人)
- 行业研究:机器视觉产业2020年进入成熟期
- linux常用命令—— 系统设置(七)
- apache mina:SimpleIoProcessorPool