1. super的基本概念

    • 在Python中,super是一个内置函数,主要用于在子类中调用父类(超类)的方法。它提供了一种简洁而灵活的方式来处理继承关系中的方法调用。
    • 当一个类继承自另一个类时,子类可能会重写父类的方法。但在某些情况下,子类需要在重写的方法中调用父类的同名方法,这时候super就发挥作用了。
  2. 语法和使用示例

    • 语法:super().__init__(arguments)(这是最常见的用于调用父类构造函数的用法)。
    • 示例:

class Parent:
    def __init__(self, name):
        self.name = name
    def say_hello(self):
        print(f"Hello, I'm {self.name}")
class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age
    def say_hello(self):
        super().say_hello()
        print(f"And I'm {self.age} years old")
child = Child("Alice", 10)
child.say_hello()
- 在这个例子中,Child类继承自Parent类。在Child类的构造函数__init__中,使用super().__init__(name)来调用父类Parent的构造函数,以初始化name属性。 - 在Child类的say_hello方法中,首先通过super().say_hello()调用父类的say_hello方法,然后再添加了自己的打印语句来显示年龄。

  1. super的工作原理(MRO - 方法解析顺序)

    • Python使用方法解析顺序(MRO)来确定在继承层次结构中调用方法的顺序。MRO是一个有序的列表,它决定了super函数在搜索父类方法时的顺序。
    • 对于大多数情况,MRO遵循广度优先的搜索策略。例如,对于一个类D继承自BC,而BC又继承自A,MRO顺序可能是D -> B -> C -> A
    • 可以通过查看类的__mro__属性来确定MRO顺序。例如:

class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
print(D.__mro__)
- 输出结果为(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>),这显示了D类在调用super函数时搜索父类方法的顺序。

  1. super在多重继承中的应用

    • 在多重继承的情况下,super的作用更加明显。它可以确保在继承多个父类时,方法调用按照正确的顺序在父类之间传递。
    • 例如:

class Left:
    def __init__(self):
        print("Left init")
class Right:
    def __init__(self):
        print("Right init")
class Sub(Left, Right):
    def __init__(self):
        super().__init__()
sub = Sub()
- 在这个例子中,Sub类继承自LeftRight类。当调用sub = Sub()时,super().__init__()会按照Sub类的MRO顺序(即先LeftRight)来调用Left类的__init__方法。如果想要调用Right类的__init__方法,可以在Left类的__init__方法中再次使用super().__init__()(前提是Left类的__init__方法正确地处理了这种调用)。