# coding=utf-8_
_author__ = "leaves"
print '--------------1------------------'
class Base1(object): # 这里必须有object否则子类调用super会报错,因为Python 2中的classobj不算做一种type,Python 3的话应该就没有这种问题
def __init__(self):
print 'Enter Base1 init'
print 'Enter Base1 init'
class Child1(Base1):
def __init__(self):
print "Enter Child1 init"
Base1.__init__(self)
print "Exit Child1 init"
child = Child1()
print '--------------2------------------'
class Base2(object):
def __init__(self):
print 'Enter Base2 init'
print 'Enter Base2 init'
class Child2(Base2):
def __init__(self):
print "Enter Child2 init"
super(Child2, self).__init__()
print "Exit Child2 init"
child = Child2()
print '--------------3------------------'
# Base2继承自Base1,这样就两个init都可以执行了
class Child3(Base2, Base1):
def __init__(self):
print "Enter Child3 init"
# 这里super只执行了Base2的init,两个父类有相同的方法名或变量名时,无法确定应继承哪一个,,Python会自动按顺序选择拥有所需方法名的第一个父类并执行,而忽略其他父类中的同名方法
super(Child3, self).__init__()
print "Exit Child3 init"
child = Child3()
print '--------------4------------------'
# Base2继承自Base1,这样就两个init都可以执行了
class Base3(Base1):
def __init__(self):
print 'Enter Base3 init'
super(Base3, self).__init__()
print 'Enter Base3 init'
class Child4(Base3):
def __init__(self):
print "Enter Child3 init"
# 这里super只执行了Base2的init,两个父类有相同的方法名或变量名时,无法确定应继承哪一个,,Python会自动按顺序选择拥有所需方法名的第一个父类并执行,而忽略其他父类中的同名方法
super(Child4, self).__init__()
print "Exit Child3 init"
child = Child4()
print '--------------5------------------'
class Base4(object):
def __init__(self):
print 'Enter Base4 init'
print 'Enter Base4 init'
class Child5(Base4):
def __init__(self):
print 'Enter Child5 init'
Base4.__init__(self)
print 'Enter Child5 init'
class Child6(Base4):
def __init__(self):
print 'Enter Child6 init'
Base4.__init__(self)
print 'Enter Child6 init'
class Child7(Child5, Child6):
def __init__(self):
print 'Enter Child7 init'
Child5.__init__(self)
Child6.__init__(self)
print 'Enter Child7 init'
child = Child7()
print '--------------6------------------'
class Base5(object):
def __init__(self):
print 'Enter Base4 init'
print 'Enter Base4 init'
class Child8(Base5):
def __init__(self):
print 'Enter Child5 init'
super(Child8, self).__init__()
print 'Enter Child5 init'
class Child9(Base4):
def __init__(self):
print 'Enter Child6 init'
super(Child9, self).__init__()
print 'Enter Child6 init'
class Child10(Child5, Child6):
def __init__(self):
print 'Enter Child7 init'
super(Child10, self).__init__()
print 'Enter Child7 init'
child = Child10()
outPut:
--------------1------------------
Enter Child1 init
Enter Base1 init
Enter Base1 init
Exit Child1 init
--------------2------------------
Enter Child2 init
Enter Base2 init
Enter Base2 init
Exit Child2 init
--------------3------------------
Enter Child3 init
Enter Base2 init
Enter Base2 init
Exit Child3 init
--------------4------------------
Enter Child3 init
Enter Base3 init
Enter Base1 init
Enter Base1 init
Enter Base3 init
Exit Child3 init
--------------5------------------<<span style="color:#ff0000;">基类Base4执行了两次></span>
Enter Child7 init
Enter Child5 init
Enter Base4 init
Enter Base4 init
Enter Child5 init
Enter Child6 init
Enter Base4 init
Enter Base4 init
Enter Child6 init
Enter Child7 init
--------------6------------------
Enter Child7 init
Enter Child5 init
Enter Base4 init
Enter Base4 init
Enter Child5 init
Enter Child7 init