You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中调用多重继承函数失败问题求助

解决Python多重继承中AttributeError: 实例没有属性'num'的问题

嘿,我来帮你搞定这个问题!你碰到的AttributeError其实是个很常见的多重继承坑——你的Merge类压根没初始化父类B的属性,所以self.num根本就没被创建出来,程序自然找不到它啦。

问题根源

当你创建Merge的实例时,Python(尤其是你用的Python 2版本)默认只会调用第一个父类(也就是A)的__init__方法,不会自动帮你调用所有父类的构造函数。所以B里的self.num从来没被初始化过,调用disp()的时候自然就报错了。

修复方案

这里给你两种靠谱的解决办法:

方法1:显式调用所有父类的__init__

这是最直观的方式,直接在子类的构造方法里手动调用每个父类的__init__,确保所有父类的属性都被初始化:

class A:
    def __init__(self):
        self.name = "kiran"
class B:
    def __init__(self):
        self.num = 10
class Merge(A,B):
    def __init__(self):
        # 手动调用A和B的构造方法
        A.__init__(self)
        B.__init__(self)
    def disp(self):
        print self.num

obj_var = Merge()
obj_var.disp()  # 注意:原代码里print obj_var.disp()会额外输出None,因为disp没有返回值

方法2:使用super()(Python 2新式类)

如果你想更规范地用面向对象的方式处理,Python 2里需要让父类继承object变成新式类,然后用super()来按MRO(方法解析顺序)调用父类构造方法:

class A(object):  # 继承object成为新式类
    def __init__(self):
        super(A, self).__init__()
        self.name = "kiran"
class B(object):
    def __init__(self):
        super(B, self).__init__()
        self.num = 10
class Merge(A,B):
    def __init__(self):
        super(Merge, self).__init__()
    def disp(self):
        print self.num

obj_var = Merge()
obj_var.disp()

这种方式需要所有父类都配合使用super(),不过对于复杂的继承结构会更灵活。

小提醒

原代码里print obj_var.disp()会输出10之后再输出None,因为disp方法没有返回值,所以直接调用obj_var.disp()就可以啦。

内容的提问来源于stack exchange,提问作者Rakesh moorthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:58:51