非原创文章转自:link
在单继承时,*super().init()与Base().init()*是一样的。super()避免了基类的显示掉用。
代码如下:
super().init()
class Base():
def __init__(self):
print("我是张三")
class A(Base):
def __init__(self):
Base.__init__(self)
print('我是李四')
A()
# 输出结果
# 我是张三
# 我是李四
Base.init()
class Base():
def __init__(self):
print("我是张三")
class A(Base):
def __init__(self):
super().__init__()
# super(A,self).__init__() python2
print('我是李四')
A()
# 输出结果
# 我是张三
# 我是李四
- 多继承
super()与父类没有实质性的关联。在单继承时,super获取的类刚好是父类,多继承时,super获取的是继承顺序中的下一个类。以下面的继承方式位列
Base
/ \
/ \
A B
\ /
\ /
C
# 就是Base为父类 同时被A类和B类继承然后C类有同事继承了A类和B类
使用super,代码如下:
class Base():
def __init__(self):
print('我是张三')
print("我是李四")
class A(Base):
def __init__(self):
print('我是陈胜')
super().__init__()
print('我是吴广')
class B(Base):
def __init__(self):
print('我是阿斌')
super().__init__()
print('我是白洁')
class C(A, B):
def __init__(self):
print("我是爸爸")
super().__init__()
print("我是妈妈")
C()
# 输出结果:
# 我是爸爸
# 我是陈胜
# 我是阿斌
# 我是张三
# 我是李四
# 我是白洁
# 我是吴广
# 我是妈妈
如果不适用super,代码如下:
lass Base():
def __init__(self):
print('我是张三')
print("我是李四")
class A(Base):
def __init__(self):
print('我是陈胜')
Base.__init__(self)
print('我是吴广')
class B(Base):
def __init__(self):
print('我是阿斌')
Base.__init__(self)
print('我是白洁')
class C(A, B):
def __init__(self):
print("我是爸爸")
A.__init__(self)
B.__init__(self)
print("我是妈妈")
C()
# 输出结果 可以看出Base()执行了两次
# 我是爸爸
# 我是陈胜
# 我是张三
# 我是李四
# 我是吴广
# 我是阿斌
# 我是张三
# 我是李四
# 我是白洁
# 我是妈妈
对于定义的类,在Python中会创建一个MRO(Method Resolution Order)列表,它代表了类继承的顺序。查看MRO列表
class Base():
def __init__(self):
print('我是张三')
print("我是李四")
class A(Base):
def __init__(self):
print('我是陈胜')
Base.__init__(self)
print('我是吴广')
class B(Base):
def __init__(self):
print('我是阿斌')
Base.__init__(self)
print('我是白洁')
class C(A, B):
def __init__(self):
print("我是爸爸")
A.__init__(self)
B.__init__(self)
print("我是妈妈")
print(C.mro())
# 输出结果
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
使用super()
class Base():
def __init__(self):
print('我是张三')
print("我是李四")
class A(Base):
def __init__(self):
print('我是陈胜')
super().__init__()
print('我是吴广')
class B(Base):
def __init__(self):
print('我是阿斌')
super().__init__()
print('我是白洁')
class C(A, B):
def __init__(self):
print("我是爸爸")
super().__init__()
print("我是妈妈")
print(C.mro())