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

  • 相关阅读:
    笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
    VMware workstation安装
    Redis bigkey分析
    MySQL drop table 影响及过程
    MySQL 大表硬连接删除
    ES elasticsearch 各种查询
    ES elasticsearch 各种聚合
    ES elasticsearch 聚合统计
    ES elasticsearch 实现 count单字段,分组取前多少位,以地理位置中心进行统计
    MySQL行溢出、varchar最多能存多少字符
  • 原文地址:https://www.cnblogs.com/Raul2018/p/9834831.html
Copyright © 2011-2022 走看看