wyz20010429 发表于 2025-12-26 13:32:54

>>> class A:
...   def say(self):
...         print("FishA")
...      
>>> class B:
...   def say(self):
...         print("FishB")
...
>>> class C(A, B):
...   def say(self):
...         super().say()
...
>>> c = C()
>>> c.say()
FishA

很好!你这个例子其实正好展示了 **多继承 + super() + MRO 方法解析顺序** 的效果。我们一步一步来看为什么最后打印的是 **FishA**。

---

## 🔍 代码回顾

```python
class A:
    def say(self):
      print("FishA")

class B:
    def say(self):
      print("FishB")

class C(A, B):
    def say(self):
      super().say()

c = C()
c.say()
```

输出:

```
FishA
```

---

## ✅ 关键点:`super()` + MRO

当你执行:

```python
c.say()
```

时发生了:

1️⃣ 进入 `C.say()`
2️⃣ `super().say()` 被调用
3️⃣ super 并不是“只找父类 A”
它是按 **MRO(方法解析顺序)** 找方法的。

---

## 📌 C 的 MRO 顺序是:

你可以打印看看:

```python
print(C.mro())
```

结果:

```
[<class '__main__.C'>,
<class '__main__.A'>,
<class '__main__.B'>,
<class 'object'>]
```

顺序是:

```
C → A → B → object
```

---

## ✨ super() 的工作方式

在 `C.say()` 里:

```python
super().say()
```

并不是“找父类 A”这么简单,而是:
&#128073; 按 MRO 顺序
&#128073; 从 **C 的下一个类(A)开始找 say()**

A 里刚好有:

```python
def say(self):
    print("FishA")
```

所以就打印:

```
FishA
```

B 根本没机会执行。

---

## ❓如果我们改继承顺序呢?

把 C 改成:

```python
class C(B, A):
```

再执行:

```python
c.say()
```

输出将变成:

```
FishB
```

因为 MRO 变为:

```
C → B → A → object
```

---

## &#127919; 总结一句话

`super()` 在多继承中不是“找父类”,
而是“**按 MRO 顺序继续往后找**”。

所以:

* C(A, B) → 找到 A.say → 打印 FishA
* C(B, A) → 找到 B.say → 打印 FishB

---

如果你还想继续深入,比如:

* super() 到底是怎么跳转的?
* 多层继承链如何工作?
* 和 Java/C++ 的 super 有啥不同?

我可以继续帮你拆得更细 &#128522;

dafan_ 发表于 2025-12-26 21:45:43

又深刻的学习一遍

40岁学编程 发表于 2026-1-5 11:23:20

1

zuo1191 发表于 2026-1-18 15:37:49

class B 多了一个super()

sophisticated 发表于 2026-1-23 16:39:30

不知道

dianledian 发表于 2026-1-25 23:20:51

03
0

GSPYZ 发表于 2026-1-28 17:30:55

1

日立sunrise 发表于 2026-2-1 23:29:43

1

abc1314 发表于 2026-2-8 22:46:30

同样的到a就结束了

liufang1123 发表于 前天 09:56

A和B没有参数
页: 26 27 28 29 30 31 32 33 34 35 [36]
查看完整版本: super() 这么优秀,官方也极力推荐,但这里面有些坑你们可能把握不住…