|
|
发表于 2025-12-26 13:32:54
|
显示全部楼层
《零基础入门学习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 方法解析顺序** 的效果。我们一步一步来看为什么最后打印的是 **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”这么简单,而是:
👉 按 MRO 顺序
👉 从 **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
```
---
## 🎯 总结一句话
`super()` 在多继承中不是“找父类”,
而是“**按 MRO 顺序继续往后找**”。
所以:
* C(A, B) → 找到 A.say → 打印 FishA
* C(B, A) → 找到 B.say → 打印 FishB
---
如果你还想继续深入,比如:
* super() 到底是怎么跳转的?
* 多层继承链如何工作?
* 和 Java/C++ 的 super 有啥不同?
我可以继续帮你拆得更细 😊
|
|