python多重继承的super调用父类的兄弟类
先看一段代码:
看输出的是什么:
为什么不输出C init ?
那么这个药从super的函数实现说起:
super函数中,mro_list得到的是类的mro列表,mro列表就是类的继承有序关系图
比如上面代码中
C, B, A 在D中的mro是下面这样的。
你提供的类名class传入来后,比如是C,那么找到C所在的index,然后加1后的class,也就是B,所以super(C,self).__init__()
实际调用的是B.__init__()
另外,如果在多重继承中,要调用父类的父类的父类。。。。,
可以直接用改类的类名就可以
结果:
其实super和父类子类没什么关系, super关系的是mro里面的顺序。
原文链接:http://30daydo.com/article/44107
转载请注明出处
class A:
def __init__(self):
print('A init')
print(self)
class B:
def __init__(self):
print('B init')
print(self)
class C:
def __init__(self):
print('C init')
print(self)
class D(C, B, A):
def __init__(self):
super(A, self).__init__()
super(C, self).__init__()
super(B, self).__init__()
print('D ')
def main():
d = D()
看输出的是什么:
B init
<__main__.D object at 0x00000000026365B0>
A init
<__main__.D object at 0x00000000026365B0>
D init-
为什么不输出C init ?
那么这个药从super的函数实现说起:
def super(class, obj):
mro_list = obj.__class__.mro()
next_parent_class = mro_list[mro_list.index(class)+1]
return next_parent_class
super函数中,mro_list得到的是类的mro列表,mro列表就是类的继承有序关系图
比如上面代码中
C, B, A 在D中的mro是下面这样的。
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
你提供的类名class传入来后,比如是C,那么找到C所在的index,然后加1后的class,也就是B,所以super(C,self).__init__()
实际调用的是B.__init__()
另外,如果在多重继承中,要调用父类的父类的父类。。。。,
可以直接用改类的类名就可以
# 多重继承
class A:
def __init__(self):
print('A init')
print(self)
def fun(self):
print('A',self)
class B(A):
def __init__(self):
print('B init')
print(self)
def fun(self):
print('B', self)
class C(B):
def __init__(self):
print('C init')
print(self)
def fun(self):
print('C', self)
class X:
def fun(self):
print('X',self)
class D(C):
def __init__(self):
# super(B, self).__init__() # super(D) -> 指向了C
print('D init')
def fun(self):
C.fun(self)
B.fun(self)
A.fun(self)
X.fun(self)
def main():
d = D()
print(d.__class__.mro())
d.fun()
if __name__ == '__main__':
main()
结果:
D init
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
C <__main__.D object at 0x00000000025F6700>
B <__main__.D object at 0x00000000025F6700>
A <__main__.D object at 0x00000000025F6700>
X <__main__.D object at 0x00000000025F6700>
其实super和父类子类没什么关系, super关系的是mro里面的顺序。
原文链接:http://30daydo.com/article/44107
转载请注明出处