鱼C论坛

 找回密码
 立即注册
查看: 21|回复: 1

[已解决]python函数不太理解这个结果

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class A():
    def __init__(self):
        print("enter A")
        print("leave A")

class B():
    def __init__(self):
        print("enter B")
        super().__init__()
        print("leave B")

class C(A):
    def __init__(self):
        print("enter C")
        super().__init__()
        print("leave C")

class D(B,C):
    def __init__(self):
        print("enter D")
        super().__init__()
        print("leave D")

d=D()

请教一下,这段函数返回值为何是这个
enter D
enter B
enter C
enter A
leave A
leave C
leave B
leave D
不太理解,麻烦哪位大神可以帮忙解答一下呢?
最佳答案
4 小时前
我来详细解释一下这个输出结果的原因,这涉及到Python的多重继承和方法解析顺序(MRO)。

首先,我们需要了解 super() 在多重继承中的工作原理。Python使用C3线性化算法来确定方法解析顺序(MRO)。

我们可以通过查看类的MRO来理解调用顺序:


  1. class A():
  2.     def __init__(self):
  3.         print("enter A")
  4.         print("leave A")

  5. class B():
  6.     def __init__(self):
  7.         print("enter B")
  8.         super().__init__()
  9.         print("leave B")

  10. class C(A):
  11.     def __init__(self):
  12.         print("enter C")
  13.         super().__init__()
  14.         print("leave C")

  15. class D(B,C):
  16.     def __init__(self):
  17.         print("enter D")
  18.         super().__init__()
  19.         print("leave D")

  20. # 查看D类的MRO
  21. print("D类的MRO:", D.__mro__)

  22. d = D()
复制代码


运行上面的代码,你会看到:

D类的MRO: (D, B, C, A, object)

**解释执行过程:**

1. 创建D的实例,首先进入D的 __init__
2. D中的 super().__init__() 根据MRO找到下一个类 B
3. 进入B的 __init__
4. B中的 super().__init__() 根据MRO找到下一个类 C
5. 进入C的 __init__
6. C中的 super().__init__() 根据MRO找到下一个类 A
7. 进入A的 __init__
8. A执行完后,逐级返回

**执行流程图示:**

D → B → C → A → 返回C → 返回B → 返回D

这就是为什么输出顺序是:
- 进入的顺序:D → B → C → A
- 离开的顺序:A → C → B → D

**关键点总结:**
1. super() 不是简单地调用父类,而是按照MRO顺序调用下一个类
2. Python的MRO使用C3算法,确保继承关系的合理性
3. 在多重继承中,super() 的调用形成了链式反应

如果你还有疑问,可以实际运行查看MRO的代码,这样能更直观地理解调用顺序。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 小时前 | 显示全部楼层    本楼为最佳答案   
我来详细解释一下这个输出结果的原因,这涉及到Python的多重继承和方法解析顺序(MRO)。

首先,我们需要了解 super() 在多重继承中的工作原理。Python使用C3线性化算法来确定方法解析顺序(MRO)。

我们可以通过查看类的MRO来理解调用顺序:


  1. class A():
  2.     def __init__(self):
  3.         print("enter A")
  4.         print("leave A")

  5. class B():
  6.     def __init__(self):
  7.         print("enter B")
  8.         super().__init__()
  9.         print("leave B")

  10. class C(A):
  11.     def __init__(self):
  12.         print("enter C")
  13.         super().__init__()
  14.         print("leave C")

  15. class D(B,C):
  16.     def __init__(self):
  17.         print("enter D")
  18.         super().__init__()
  19.         print("leave D")

  20. # 查看D类的MRO
  21. print("D类的MRO:", D.__mro__)

  22. d = D()
复制代码


运行上面的代码,你会看到:

D类的MRO: (D, B, C, A, object)

**解释执行过程:**

1. 创建D的实例,首先进入D的 __init__
2. D中的 super().__init__() 根据MRO找到下一个类 B
3. 进入B的 __init__
4. B中的 super().__init__() 根据MRO找到下一个类 C
5. 进入C的 __init__
6. C中的 super().__init__() 根据MRO找到下一个类 A
7. 进入A的 __init__
8. A执行完后,逐级返回

**执行流程图示:**

D → B → C → A → 返回C → 返回B → 返回D

这就是为什么输出顺序是:
- 进入的顺序:D → B → C → A
- 离开的顺序:A → C → B → D

**关键点总结:**
1. super() 不是简单地调用父类,而是按照MRO顺序调用下一个类
2. Python的MRO使用C3算法,确保继承关系的合理性
3. 在多重继承中,super() 的调用形成了链式反应

如果你还有疑问,可以实际运行查看MRO的代码,这样能更直观地理解调用顺序。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-27 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表