之前我们对于super的理解就是,调用父类的方法。那么这种理解是否完全正确呢?运行如下的代码,看看结果。
代码:
class Base(object):
def __init__(self):
print('-----Base----')
class A(Base):
def __init__(self):
print('------A-----')
super().__init__()
class B(Base):
def __init__(self):
print('-----B----')
super().__init__()
class C(A,B):
def __init__(self):
print('----C----')
super().__init__()
c = C()
回答
whit回答
如果我们把super仅仅理解成,调用父类的方法。那么屏幕应该会输出:
----C----
------A-----
-----Base----
实际的测试结果却不是这样。可见如果涉及到多继承的时候,不能把super简单的理解为调用父类的方法。
首先,来看下super的工作原理:
def super(cls,self):
mro = self.__class__.mro()
return mro[mro.index(cls) + 1]
接下来,了解一下什么是方法解析顺序表(MRO列表)。
事实上,对于你定义的每一个类,python会计算出一个方法解析顺序表,它代表了这个类的继承顺序。
假如你定义了一个A类,你可以这样去查看MRO列表:A.mro()
回到我们上面的代码:
我们看到,在A类的 __init__方法里的super 最终返回的是 B类,而不是我们以为的Base类。所以不能单纯的认为super就是调用父类的方法。
(0)