python 有关super

# 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值