在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其余的语言有一些不同的地方,在网上找了一些资料,发现基本上不多有文章能把个人疑惑讲明白,其中这篇文章最有价值的地方是它讲解了咱们平时对super的正确使用方法。python
首先看一段程序:编程
class A: def __init__(self): print("A", end=" ") super().__init__() class E: def __init__(self): print("E", end=" ") super().__init__() class B(E): def __init__(self): print("B", end=" ") super().__init__() class D: def __init__(self): print("D", end=" ") super().__init__() class C(A, B, D): def __init__(self): print("C", end=" ") A.__init__(self) D.__init__(self) B.__init__(self) print("MRO:", [x.__name__ for x in C.__mro__]) print(C())
这段程序的打印结果是:ide
MRO: ['C', 'A', 'B', 'E', 'D', 'object'] C A B E D D B E D <__main__.C object at 0x1040340b8>
这段程序能够简单演示super()的用法,比较简单的概念是__mro__,它告诉咱们某个类的继承链信息,生成这个链的原则有两条:wordpress
要想理解上边程序的打印结果,只须要知道super()其实它至关于super(cls, self),知道了这一点答案就很清晰了code
当执行A.__init__(self)
这行代码的时候,self指向了c实例对象,而后打印出A,当调用super().__init__()
这行代码的时候,实际至关于super(A, self).__init__()
的调用, super(A, self)
的会在self.__mro__中查找排在A后边的类,这样就实现了继承链的调用了。对象
其实到了这里,咱们基本上能猜到super()的实现原理了,虽然看上去它像没传入参数同样,其实否则,若是咱们改变参数,找到的父类是不一样的。排序
咱们把上边代码中的A稍微改变一下:继承
class A: def __init__(self): print("A", end=" ") super(D, self).__init__()
那么在这里super(D, self)
获取的就是object了,所以打印结果是:get
MRO: ['C', 'A', 'B', 'E', 'D', 'object'] C A D B E D <__main__.C object at 0x1040340b8>
super()具备运行时特性,也就是说它的结果是动态计算出来的,利用这一点能够写出扩展性比较好的程序,同时,从编程语义也更符合生活习惯。目前可以总结的就是这样。it