Python 3 OOP多继承方法报错原因分析及解决咨询
多继承Python代码错误分析与解决办法
错误1:调用U1.Proc1(7)报错unsupported operand type(s) for *: 'Child0' and 'int'
原因
子类Child0的构造方法里,super().__init__(self)写法完全错误。super()调用父类构造时,不需要手动传self,而且应该传入父类P1需要的Q1参数。现在传成self导致P1的Q1被赋值为Child0对象本身,执行self.Q1 * self.I1时就是拿对象乘整数,触发类型错误。
解决办法
把super().__init__(self)改成super().__init__(Q1),让P1的构造方法正确接收初始化参数,给Q1赋值为传入的数值。
错误2:调用U1.Proc2(8)报错'Child0' object has no attribute 'Q2'
原因
Python多继承中,super()默认只调用继承顺序里第一个父类(这里是P1)的构造方法,不会自动触发第二个父类P2的构造。而你把P2.__init__(self, Q2)注释掉了,导致Child0对象根本没有初始化Q2属性,调用Proc2时访问self.Q2自然找不到。
解决办法
取消P2.__init__(self, Q2)的注释,显式调用P2的构造方法,确保Q2属性被正确初始化。
错误3:调用U1.Combine(7,8)报错'int' object has no attribute 'I1'
原因
- 直接用
P1.Proc1(B1,12)调用方法时,相当于把P1类作为调用主体,此时方法的第一个参数self被传入了整数B1(也就是9),而不是Child0对象。Proc1里试图访问self.I1,但整数没有这个属性,直接报错。 - 另外
Proc1和Proc2原本没有返回值,就算调用正确,用它们的返回结果(默认是None)做除法也会报错。
解决办法
- 调用父类方法时,要以子类对象作为
self,可以写成self.Proc1(B1)或者P1.Proc1(self, B1); - 给
Proc1和Proc2添加返回值,把计算好的R1和R2返回,这样才能进行除法运算。
修正后的完整代码
class P1: def __init__(self, Q1): self.Q1 = Q1 def Proc1(self, I1): self.I1 = I1 R1 = self.Q1 * self.I1 self.R1 = R1 print("Result from Parent 1:", R1) return R1 # 添加返回值 class P2: def __init__(self, Q2): self.Q2 = Q2 def Proc2(self, I2): self.I2 = I2 R2 = self.Q2 + self.I2 self.R2 = R2 print("Result from Parent 2:", R2) return R2 # 添加返回值 class Child0(P1, P2): def __init__(self, Q1, Q2): super().__init__(Q1) # 修正super调用参数 P2.__init__(self, Q2) # 初始化P2的属性 def Combine(self, A1, A2): B1 = 9 B2 = 10 # 用子类对象调用父类方法,获取返回值后计算 res1 = self.Proc1(B1) res2 = self.Proc2(B2) print("Combined result:", res1 / res2) U1 = Child0(6, 10) # 现在可以正常执行以下调用 U1.Proc1(7) U1.Proc2(8) U1.Combine(7,8)
内容的提问来源于stack exchange,提问作者Abi
相关产品推荐
相关产品推荐

