-
super
的基本概念- 在Python中,
super
是一个内置函数,主要用于在子类中调用父类(超类)的方法。它提供了一种简洁而灵活的方式来处理继承关系中的方法调用。 - 当一个类继承自另一个类时,子类可能会重写父类的方法。但在某些情况下,子类需要在重写的方法中调用父类的同名方法,这时候
super
就发挥作用了。
- 在Python中,
-
语法和使用示例
- 语法:
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
方法,然后再添加了自己的打印语句来显示年龄。
-
super
的工作原理(MRO - 方法解析顺序)- Python使用方法解析顺序(MRO)来确定在继承层次结构中调用方法的顺序。MRO是一个有序的列表,它决定了
super
函数在搜索父类方法时的顺序。 - 对于大多数情况,MRO遵循广度优先的搜索策略。例如,对于一个类
D
继承自B
和C
,而B
和C
又继承自A
,MRO顺序可能是D -> B -> C -> A
。 - 可以通过查看类的
__mro__
属性来确定MRO顺序。例如:
- Python使用方法解析顺序(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
函数时搜索父类方法的顺序。
-
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
类继承自Left
和Right
类。当调用sub = Sub()
时,super().__init__()
会按照Sub
类的MRO顺序(即先Left
后Right
)来调用Left
类的__init__
方法。如果想要调用Right
类的__init__
方法,可以在Left
类的__init__
方法中再次使用super().__init__()
(前提是Left
类的__init__
方法正确地处理了这种调用)。