您的位置:首页 > 编程语言 > Python开发

python 有关super

2015-08-29 17:22 501 查看
# 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: