python类继承与子类实例初始化用法分析

967次阅读  |  发布于5年以前

本文实例讲述了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

希望本文所述对大家的Python程序设计有所帮助。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8