zoukankan      html  css  js  c++  java
  • python 类继承与子类实例初始化

    From: https://blog.csdn.net/cs0301lm/article/details/6002504?utm_source=blogxgwz4

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

    __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
    ---------------------

  • 相关阅读:
    励志
    哈佛大学用这12张图,教育了10亿人
    5分钟弄懂Docker!
    第四节:Web爬虫之pyquery解析库
    第十节:numpy之数组文件操作
    第三节:Web爬虫之BeautifulSoup解析库
    国嵌内核驱动进阶班-7-1(Ioctl设备控制)
    国嵌内核驱动进阶班-6-4 竞争与互斥(2)
    国嵌内核驱动进阶班-6-4 竞争与互斥
    C++类对象的内存结构
  • 原文地址:https://www.cnblogs.com/Raul2018/p/9834831.html
Copyright © 2011-2022 走看看