美文网首页
Python中super函数的使用

Python中super函数的使用

作者: 4thirteen2one | 来源:发表于2019-04-30 18:43 被阅读0次

    super() 函数是用于调用父类(超类)的一个方法。self 始终为子类的实例

    super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO,Method Resolution Order)、重复调用(钻石继承)等种种问题。

    MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

    在单重继承中用不用 super 都没关系;但是,使用 super() 是一个好的习惯。一般我们在子类中需要调用父类的方法时才会这么用。

    class A:
     def m(self):
      print('A')
     
    class B:
     def m(self):
      print('B')
     
    class C(A):
     def m(self):
      print('C')
      super().m()
     
    C().m()
    

    super()的好处就是可以避免直接使用父类的名字:如果你要改变子类继承的父类(由A改为B),你只需要修改一行代码(class C(A): -> class C(B))即可,而不需要在class C 的大量代码中去查找、修改基类名,另外一方面代码的可移植性和重用性也更高

    使用super

    class A:
        def __init__(self):
            print("Enter A")
            print("Leave A")
    
    class B(A):
        def __init__(self):
            print("Enter B")
            super(B, self).__init__()
            print("Leave B")
    
    class C(A):
        def __init__(self):
            print("Enter C")
            super(C, self).__init__()
            print("Leave C")
    
    class D(A):
        def __init__(self):
            print("Enter D")
            super(D, self).__init__()
            print("Leave D")
    
    class E(B, C, D):
        def __init__(self):
            print("Enter E")
            super(E, self).__init__()
            print("Leave E")
    
    E()
    

    运行结果为:(E, (B, C, D), A, A, (D, C, B), E)

    Enter E
    Enter B
    Enter C
    Enter D
    Enter A
    Leave A
    Leave D
    Leave C
    Leave B
    Leave E
    

    不使用super

    class A:
        def __init__(self):
            print("Enter A")
            print("Leave A")
    
    class B(A):
        def __init__(self):
            print("Enter B")
            A.__init__(self)
            print("Leave B")
    
    class C(A):
        def __init__(self):
            print("Enter C")
            A.__init__(self)
            print("Leave C")
    
    class D(A):
        def __init__(self):
            print("Enter D")
            A.__init__(self)
            print("Leave D")
    
    class E(B, C, D):
        def __init__(self):
            print("Enter E")
            B.__init__(self)
            C.__init__(self)
            D.__init__(self)
            print("Leave E")
    
    E()
    

    运行结果为:(E, B(AA)B, C(AA)C, D(AA)D, E)

    Enter E
    Enter B
    Enter A
    Leave A
    Leave B
    Enter C
    Enter A
    Leave A
    Leave C
    Enter D
    Enter A
    Leave A
    Leave D
    Leave E
    

    相关文章

      网友评论

          本文标题:Python中super函数的使用

          本文链接:https://www.haomeiwen.com/subject/sjxbnqtx.html