鱼C论坛

 找回密码
 立即注册
查看: 61|回复: 4

[技术交流] 关于扩展阅读的super()

[复制链接]
发表于 前天 21:14 | 显示全部楼层 |阅读模式

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

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

x
本阅读最后差错题的上面一段代码的答案是错的吧。打印顺序应该是:FishB,FishD,FishA,FishC,FishE。

评分

参与人数 1荣誉 +6 鱼币 +6 贡献 +6 C币 +6 收起 理由
小甲鱼 + 6 + 6 + 6 + 6 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 21:16 | 显示全部楼层
亲爱的鱼油,感谢你提出关于 super() 的问题!你提到的打印顺序可能有一些误解。让我来简要解释一下 super() 在多继承中的行为,并提供一个示例来说明正确的顺序。

首先,super() 的方法解析顺序(MRO)遵循 Python 的 C3 线性化算法。在多继承中,它会按照类的继承顺序调用父类方法。如果每个类的 __init__ 方法中都先调用 super().__init__(),然后打印类名,那么打印顺序会从最底层的父类开始,逐步向上。

假设我们有以下类结构(这是一个常见的多继承示例):


  1. class FishA:
  2.     def __init__(self):
  3.         print("FishA")

  4. class FishB(FishA):
  5.     def __init__(self):
  6.         super().__init__()
  7.         print("FishB")

  8. class FishC(FishA):
  9.     def __init__(self):
  10.         super().__init__()
  11.         print("FishC")

  12. class FishD(FishB, FishC):
  13.     def __init__(self):
  14.         super().__init__()
  15.         print("FishD")

  16. class FishE(FishD):
  17.     def __init__(self):
  18.         super().__init__()
  19.         print("FishE")
复制代码


当我们创建 FishE() 的实例时,输出顺序是:
FishA
FishC
FishB
FishD
FishE

这个顺序是由 MRO 决定的:首先调用最底层的父类(FishA),然后按照继承链向上。你提到的顺序 FishB, FishD, FishA, FishC, FishE 可能源于对代码结构或 super() 调用位置的误解。如果打印语句在 super() 之前,顺序会不同,但标准做法是先调用 super()。

如果你能提供更多细节(比如具体的代码片段),我可以进一步帮你分析。总之,super() 的行为依赖于类的继承关系,建议检查类的 MRO 使用 Class.__mro__ 来验证。

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

使用道具 举报

 楼主| 发表于 前天 21:44 | 显示全部楼层
你源代码是这样的:
class A:
    def say(self):
        print("FishA")

class B:
    def say(self):
        print("FishB")
        
class C(A):
    def say(self):
        A.say(self)
        print("FishC")
        
class D(B):
    def say(self):
        B.say(self)
        print("FishD")

class E(C, D):
    def say(self):
        D.say(self)
        C.say(self)
        print("FishE")

e = E()
e.say()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 21:44 | 显示全部楼层
laocaiye 发表于 2025-10-18 21:44
你源代码是这样的:
class A:
    def say(self):
...


亲爱的鱼油,感谢你提供具体的代码示例!你观察得很仔细,让我们一起来分析一下这个代码的执行顺序。

首先,你提供的代码是:


  1. class A:
  2.     def say(self):
  3.         print("FishA")

  4. class B:
  5.     def say(self):
  6.         print("FishB")
  7.         
  8. class C(A):
  9.     def say(self):
  10.         A.say(self)
  11.         print("FishC")
  12.         
  13. class D(B):
  14.     def say(self):
  15.         B.say(self)
  16.         print("FishD")

  17. class E(C, D):
  18.     def say(self):
  19.         D.say(self)
  20.         C.say(self)
  21.         print("FishE")

  22. e = E()
  23. e.say()
复制代码


当你执行 e.say() 时,输出顺序确实是:

  1. FishB
  2. FishD
  3. FishA
  4. FishC
  5. FishE
复制代码


原因如下:
- 在 E.say() 中,先调用 D.say(self),这导致:
  - 执行 B.say(self),打印 FishB
  - 然后打印 FishD
- 接着调用 C.say(self),这导致:
  - 执行 A.say(self),打印 FishA
  - 然后打印 FishC
- 最后,打印 FishE

所以,你的判断完全正确!输出顺序是 FishB, FishD, FishA, FishC, FishE。如果之前的阅读材料中有错误,建议对照这个代码进行验证。如果你有其他疑问,欢迎继续讨论!

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

使用道具 举报

发表于 昨天 06:35 | 显示全部楼层
感谢指出,确实答案应该是跟上一段一致的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-20 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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