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 mama
i 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:
C
A
B
B
虽然A类并未继承B类,但是在C类中的父类关系却是:C继承了A,A继承了B
所以调用A.__init(self)__的时候,不仅仅打印了A,还打印了B
这就导致,B的init被调用了两次
所以我们要
避免多重继承
super的使用必须一致(要么全部用super,要么全不用)
如果代码的使用范围包括python2,在python3中也应该显示地继承自object
调用父类时必须查看类的层次结构
摘自 《Python高级编程》