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

  • 相关阅读:
    MIN (Transact-SQL)【转】
    ROW_NUMBER() OVER函数的基本用法用法【转】
    读取文件中的内容
    Stopwatch 和TimeSpan介绍【转】
    TimeSpan类【转】
    Stopwatch 类【转】
    ToString()使用方法
    用c#读取文件内容中文是乱码的解决方法:
    vue实现购物车和地址选配(二)
    vue实现购物车和地址选配
  • 原文地址:https://www.cnblogs.com/Raul2018/p/9834831.html
Copyright © 2020-2023  润新知