测试了一个下午,上网找了很久,真的这个区别太让我郁闷了!最郁闷的是python官网文档没有这么详细的区别介绍
Python类分为两种,一种叫经典类,一种叫新式类。两种都支持多继承。
情形一:
B继承于A,C继承于A和B
# 经典类
class A():
def __init__(self):
print 'A'
class B(A):
def __init__(self):
A.__init__(self)
print 'B'
class C(B, A):
def __init__(self):
A.__init__(self)
B.__init__(self)
print 'C'
C需要调用父类的init()函数时,前者会导致父类A的init()函数被调用2次,效率不高,而且不符合DRY原则,因此有了下面的新方法
# 新式类
class A(object):
def __init__(self):
print 'A'
class B(A):
def __init__(self):
super(B, self).__init__()
print 'B'
class C(B, A):
def __init__(self):
super(C, self).__init__()
print 'C'
采用super()方式时,会自动找到第一个多继承中的第一个父类,那就不用调用两次了
情形二:
B继承于A,D继承于C和B
class A(object):
def __init__(self):
print 'A'
class B(A):
def __init__(self):
super(B, self).__init__()
print 'B'
class C(object):
def __init__(self):
print 'C'
class D(B, C):
def __init__(self):
super(B, self).__init__()
C.__init__(self)
print 'B'
两个类的初始化不同,而只有B需要追溯父类使用super(),另一个就要沿用旧方法才能初始化
情形三:
菱形继承,B继承于A,C继承于A,D继承B和C
class A():
def __init__(self):
print('enter A')
print('leave A')
class B(A):
def __init__(self):
print('enter B')
super().__init__()
print('leave B')
class C(A):
def __init__(self):
print('enter C')
super().__init__()
print('leave C')
class D(B, C):
def __init__(self):
print('enter D')
super().__init__()
print('leave D')
d = D()
使用 super() 可以很好地避免构造函数被调用两次的问题
##实验测试了情形一和情形二,如有修改或错误地方,还望大虾指正
Reference: