python和它的super
如果用过python2,你一定见过下面这个奇怪的代码
class Mama(object): def says(self): print('i am mama')class Sister(Mama): def says(self): Mama.says(self) print('i am sister')if __name__ == '__main__': sister = Sister() sister.says()
它的结果是
i am mamai am sister
或者这种奇怪的写法, 不过它只支持继承了object类的
class Sister(Mama): def says(self): super(Sister, self).says() print('i am sister')
python和多重继承的坑
如果你之前没见过下面的这段代码,那你最好运行下
class A(object): def __init__(self): print('A') super(A, self).__init__()class B(object): def __init__(self): print('B') super(B, self).__init__()class C(A, B): def __init__(self): print('C'), A.__init__(self) B.__init__(self)if __name__ == '__main__': print('MRO:', [x.__name__ for x in C.__mro__]) print('Calls:') C()
它的结果是
MRO: ['C', 'A', 'B', 'object']Calls:CABB
虽然A类并未继承B类,但是在C类中的父类关系却是:C继承了A,A继承了B
所以调用A.__init(self)__的时候,不仅仅打印了A,还打印了B 这就导致,B的init被调用了两次
所以我们要
避免多重继承
super的使用必须一致(要么全部用super,要么全不用) 如果代码的使用范围包括python2,在python3中也应该显示地继承自object 调用父类时必须查看类的层次结构
摘自 《Python高级编程》