python 类继承与子类实例初始化

[ 先贴参考书籍原文(中文英文对照)]

__init__方法介绍:
If a base class has an __init__() method the derived class's __init__() method must explicitly call it to ensure proper initialization of the base class part of the instance; for example: "BaseClass.__init__(self, [args...])"
As a special contraint on constructors, no value may be returned; doing so will cause a TypeError to be raised at runtime.
如果其基类也具有__init__(), 必须显式地在__init__()调用它, 以保证能够适当地初始化它的基类部分;例如: "BaseClass.__init__(self, [args...])"作为构造器的特殊情况, 它没有值被返回, 如果返回某个值, 会在运行时抛出异常TypeError.

 

1.子类定义了__init__方法时若未显示调用基类__init__方法,python不会帮你调用,解释运行都Ok

class  A():
    def __init__(self):
        print 'a'
class B(A):
    def __init__(self):
        print 'b'

if __name__=='__main__':
    b=B()

>>>
b
2.子类未定义__init__方法时,python会自动帮你调用首个基类的__init__方法,注意是首个。即:子类继承自多个基类时,只有第一个基类的__init__方法会被调用到:

class A:
    def __init__(self):
        print 'a'

class B:
    def __init__(self):
        print 'b'
class C(B):
    def __init__(self):
        print 'c'
    pass
class D1(A,B,C):
    pass
class D2(B,A,C):
    pass
class D3(C,B,A):
    pass

if(__name__=='__main__'):
    print 'd1------->:'
    d1=D1()
    print 'd2------->:'
    d2=D2()
    print 'd3------->:'
    d3=D3()
   
>>>
d1------->:
a
d2------->:
b
d3------->:
c

 

 

3)基类未定义__init__方法时,若此时子类显示调用基类__init__方法时,python向上超找基类的基类的__init__方法并调用,实质同2

class A:
    def __init__(self):
        print 'a'

class B:
    def __init__(self):
        print 'b'
class C1(B,A):
    pass
class C2(A,B):
    pass

class D1(C1):
    def __init__(self):
        C1.__init__(self)
class D2(C2):
    def __init__(self):
        C2.__init__(self)


if(__name__=='__main__'):
    print 'd1------->:'
    d1=D1()
    print 'd2------->:'
    d2=D2()

 

>>>
d1------->:
b
d2------->:
a

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值