在继承上,super与直接调用类方法继承的利弊 python笔记

222 阅读1分钟

文章参考来源彻底搞懂python super函数的作用写的很易懂比我写的详细

super()`是在方法解析顺序(MRO)列表中调用下一位的方法,python的多重继承是按照MRO的顺序来继承的
MRO列表原则

  • 子类永远在父类前面

  • 如果有多个父类会按照它们在列表的顺序检查

  • 如果下一个类有两个合法选择,选择第一个

      class Base(object):
          def __init__(self):
              print("enter Base")
              print("leave Base")
    
    
      class A(Base):
          def __init__(self):
              print("enter A")
              super(A,self).__init__()
              print("leave A")
    
    
      class B(Base):
          def __init__(self):
              print("enter B")
              super(B,self).__init__()
              print("leave B")
    
      class C(A,B):
          def __init__(self):
              print("enter C")
              super(C,self).__init__()
              print("leave C")
    

创建一个对象c=C()
此时MRO列表顺序为C->-A->-B->Base->object可以用print(C.mro())来查看
如果不用super(A,self)而用Base.__init__()的话,那么当C的实例被创建时会调用两次Base的构造函数
而A类当中的super(A,self)中的self依旧是调用这个函数的c对象而不是A的对象,所以此时的MRO列表为C->-A->-B->Base->object而不是A->base->object