super()继承
转自:https://www.cnblogs.com/silencestorm/p/8404046.html
class Base(object):
def __init__(self):
print("Enter Base")
print("Leave Base")
class A(Base):
def __init__(self):
print('Enter A')
super(A, self).__init__() # 等同于python3: super().__init__()
print('Leave A')
class B(Base):
def __init__(self):
print('Enter B')
super(B, self).__init__()
print('Leave B')
class C(A,B):
def __init__(self):
print('Enter C')
super(C, self).__init__()
print('Leave C')
C()
print(C.mro())
"""
Enter C
Enter A
Enter B
Enter Base
Leave Base
Leave B
Leave A
Leave C
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
"""
每一个类,都有一个 MRO(Method Resolution Order) 列表。这是python 搜索属性和方法时的顺序。可以通过 class.mro()
或 obj.__class__.mro()
来查看。
>>> A.mro()
[<class '__main__.A'>, <class '__main__.Base'>, <class 'object'>]
super()的原理
:
def super(class,instance):
mro = instance.__class__.mro()
return mro[mro.index(class)+1] # 返回的是当前 instance 的 mro 列表中的 class索引+1 的类
所以上面代码执行顺序:
line 24: 实例化 C 类
line 21: 执行 C() 实例的 mro 中index=1的类 A
line 9: 此时 super(A, self).__init__() 中的 self,代表的是 C类实例,所以下一步执行 C实例 mro 中的 类B
line 15: 此时的 self 还是 C实例,所以根据mro顺序,下一步执行mro中的 Base类