你不知道的super

收藏
super
14
Feb 21, 2018

之前我们对于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)

提交成功