1. super()的功能看下面代码classB1(object):def__init__(self):self.b110classB2(object):def__init__(self):self.b220classS1(B1,B2):def__init__(self):B1.__init__(self)B2.__init__(self)self.s130if__name____main__:mys1S1()printmys1.b1,mys1.b2,mys1.s1# 10 20 30以上是Python2.2之前的写法。此时如要将S1的父类B2改成B3则__init__()中所有和B2相关的都要改成B3的并且由以上也能看出所有父类的__init__()都要显式地列在S1的__init__()中。看Python2.2及其之后的写法Python2.2引入了super()classB1(object):def__init__(self):super(B1,self).__init__()self.b110classB2(object):def__init__(self):super(B2,self).__init__()self.b220classS2(B1,B2):def__init__(self):super(S2,self).__init__()self.s230if__name____main__:mys2S2()printmys2.b1,mys2.b2,mys2.s2由以上代码可以看出如要将S1的父类由B2改成B3则S2的代码几乎没有什么变动只有第一行类的定义时将B2改成B3即可。要注意的是在B1和B2的__init__()函数中都用了super()那么在S2的__init__()函数中也用super()则只需写一行super()即可而不用再显式调用所有父类的__init__()函数了。2. 注意事项要么采用Python2.2之前的写法全部显式调用父类的构造器要么全部用super()不能混用。super、MRO都是针对新式类的如果是传统类还是采用上面第一段代码中的写法吧。3. super()的原理super()其实做的就是这件事defsuper(cls,inst):mroinst.__class__.mro()returnmro[mro.index(cls)1]由以上代码inst负责生成MRO的list定位到当前cls在MRO中的位置然后后移一位返回此处的类MRO就是Method Resolution Order详见这篇文章The Python 2.3 Method Resolution Order.请看下面这个钻石继承的例子classA(object):def__init__(self):print(In As __init__())classB(A):def__init__(self):print(Enter Bs __init__())super(B,self).__init__()print(Leave Bs __init__())classC(A):def__init__(self):print(Enter Cs __init__())super(C,self).__init__()print(Leave Cs __init__())classD(B,C):def__init__(self):print(Enter Ds __init__())super(D,self).__init__()print(Leave Ds __init__())dD()print(d.__class__.__mro__)程序的输出如下Enter Ds __init__() Enter Bs __init__() Enter Cs __init__() In As __init__() Leave Cs __init__() Leave Bs __init__() Leave Ds __init__() (class __main__.D, class __main__.B, class __main__.C, class __main__.A, class object)从以上程序可以清楚地看出在上面这个钻石继承中最后对于类D来说其MRO就是 D B C A故在执行了类B的构造器后就去执行了类C的构造器而不是类A的构造器。关于MRO的一点小总结基类总是出现在派生类的后面如果有多个基类基类的顺序保持不变。4. 参考文献Python的内置函数super()与类方法函数继承有关super的问答Things to know about Python superPython’s super() considered super!super on stackoverflowThe Python 2.3 Method Resolution Order