简书第一篇 ,简书第二篇,博客园的文章,这篇博客园文章讲的很好html
经过继承建立的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从通常到特殊的过程。在某些 OOP 语言中,一个子类能够继承多个基类。可是通常状况下,一个子类只能有一个基类,要实现多重继承,能够经过多级继承来实现
python2中经典类和新式类的继承方式不一样,经典类采用深度优先搜索的继承,新式类采用的是广度优先搜索的继承方式 python3中经典类和新式类的继承方式都采用的是都采用广度优先搜索的继承方式python
在Python 3.x中取消了经典类,默认都是新式类,而且没必要显式的继承object,也就是说: class Person(object): pass class Person(): pass class Person: pass 三种写法并没有区别,推荐第一种
可是在Python2.x中,默认都是经典类,只有显式继承了object才是新式类,即: class Person(object): pass 新式类写法 class Person(): pass 经典类写法 class Person: pass 经典类写法
举个例子来讲明:现有4个类,A,B,C,D类,D类继承于B类和C类,B类与C类继承于A类。class D(B,C) 实例化D类less
如今构造函数的继承状况为: 若D类有构造函数,则重写全部父类的继承 若D类没有构造函数,B类有构造函数,则D类会继承B类的构造函数 若D类没有构造函数,B类也没有构造函数,则D类会继承 A类 的构造函数,而 不是C类 的构造函数(经典类继承顺序,详见下面代码) 若D类没有构造函数,B类也没有构造函数,A类也没有构造函数,则D类才会继承C类的构造函数
如今构造函数的继承状况为: 若D类有构造函数,则重写全部父类的继承 若D类没有构造函数,B类有构造函数,则D类会继承B类的构造函数 若D类没有构造函数,B类也没有构造函数,则D类会继承 C类 的构造函数,而 不是A类 的构造函数(新式类继承顺序,详见下面代码) 若D类没有构造函数,B类也没有构造函数,C类也没有构造函数,则D类才会继承A类的构造函数
super()方法只能用于新式类中 接下来就是super().__init__()的用法 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类函数
class Base(object): def __init__(self): print “Base init”
则普通方法以下3d
class Leaf(Base): def __init__(self): Base.__init__(self) print “Leaf init”
super方法以下code
class Leaf(Base): def __init__(self): super(Leaf, self).__init__() print “Leaf init”
super不是父类,而是继承顺序的下一个类,在多重继承时会涉及继承顺序,super()至关于返回继承顺序的下一个类,而不是父类,相似于这样的功能:htm
def super(class_name, self): mro = self.__class__.mro() return mro[mro.index(class_name) + 1] #mro()用来得到类的继承顺序。 例如: class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'enter A ' # Base.__init__(self) super(childA, self).__init__() print 'leave A' class childB(Base): def __init__(self): print 'enter B ' # Base.__init__(self) super(childB, self).__init__() print 'leave B' class childC(childA, childB): pass c = childC() print c.__class__.__mro__ #输出: enter A enter B Base create leave B leave A (<class '__main__.childC'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.Base'>, <type 'object'>)