lishilishi98 发表于 2025-10-24 11:12:18

xuexixuexi

Python-02 发表于 2025-11-5 17:44:13

我想知道

dafan_ 发表于 2025-11-5 22:22:43

{:5_106:}

是秦秦啊 发表于 2025-11-10 10:31:02

D没有参数

yanghp 发表于 2025-11-11 10:25:16

不会

zhuzhanglei 发表于 2025-11-12 20:59:29

最后代码报错是因为什么原因?是因为没有继承self吗?

苏小灭 发表于 2025-11-15 16:16:15

1

欢愉 发表于 2025-11-17 17:18:00

学习

走走看看笑笑 发表于 2025-11-18 16:44:46

本帖最后由 走走看看笑笑 于 2025-11-18 17:09 编辑

不懂

够用就行阿嚏 发表于 2025-11-20 10:20:41

q

Xsy123 发表于 2025-11-21 19:04:14

arg未绑定对象

zhengss 发表于 2025-11-26 15:16:47

父类的构造方法没有入参

熊熊学python 发表于 2025-11-26 16:31:52

A,B无arg参数

fishchamster 发表于 2025-12-5 08:39:12

1

vigi 发表于 2025-12-11 06:27:29

要理解 “D.__init__需要 arg 参数但未传递”,关键在于多继承的方法解析顺序(MRO) 和super () 的参数传递逻辑,结合你的代码结构一步步拆解就很清晰了:
先明确类的继承关系和每个类的__init__参数
假设已修正构造方法名为__init__(原代码是_init_,这是基础错误),各阶级的__init__定义如下:
python
运行
class A:
    def __init__(self):# 无参数
      super().__init__()

class B:
    def __init__(self):# 无参数
      super().__init__()

class C(A):
    def __init__(self, arg):# 需要1个参数arg
      super().__init__()# 调用时没传参数

class D(B):
    def __init__(self, arg):# 需要1个参数arg
      super().__init__()# 调用时没传参数

class E(C, D):
    def __init__(self, arg):# 需要1个参数arg
      super().__init__(arg)# 调用时传了arg
核心:MRO(方法解析顺序)决定调用链
当实例化E时(e = E(520)),Python 会按MRO 顺序调用所有相关类的__init__。对于E(C, D),MRO 顺序是:E → C → A → D → B → object
(可以通过E.__mro__查看这个顺序,这是 Python 多继承中 “先左后右、深度优先” 的解析规则)
一步步看参数传递过程
调用 E 的__init__:E.__init__(self, 520) 执行,内部调用 super().__init__(520)。根据 MRO,super()此时指向C,所以实际调用 C.__init__(self, 520)(参数520被传递给 C,符合 C 需要arg的要求)。
调用 C 的__init__:C.__init__(self, 520) 执行,内部调用 super().__init__()(注意:这里没传任何参数)。根据 MRO,super()此时指向A,所以实际调用 A.__init__(self)(A 不需要参数,没问题)。
调用 A 的__init__:A.__init__(self) 执行,内部调用 super().__init__()(依然没传参数)。根据 MRO,super()此时指向D(因为 A 的下一个是 D),所以实际调用 D.__init__(self)。
问题出在这里:调用 D 的__init__D.__init__ 的定义是 def __init__(self, arg):,它必须接收 1 个参数 arg,但此时从 A 的super()过来的调用是 D.__init__(self)(没有传arg)。因此,Python 会报错:TypeError: D.__init__() missing 1 required positional argument: 'arg'。
一句话总结
因为 MRO 顺序要求在调用完 A 的__init__后必须调用 D 的__init__,但 D 的__init__需要arg参数,而整个调用链中(从 C 到 A 的super())没有传递这个参数,导致 D 的__init__参数缺失。

66大顺123 发表于 2025-12-11 11:15:44

偏离

take_off 发表于 2025-12-14 10:59:25

应该是A的super没有放置参数

zhang_emo 发表于 2025-12-18 15:09:03

好难啊

洛飘 发表于 2025-12-24 17:35:28

学习学习

wyz20010429 发表于 2025-12-26 13:30:06

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