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

Python三层继承中子类无法访问父类实例变量的问题

问题分析与解决:Python继承类无法访问父类实例变量

你遇到的问题根源有两个:

1. 子类重写__init__但未调用父类构造方法

当子类定义了自己的__init__方法时,Python不会自动触发父类的__init__执行,这就导致父类的实例变量(比如A的a1/a2、B的b1/b2)根本没有被初始化,自然无法通过子类对象访问。

2. 实例方法缺少self参数

testa()、testb()、testc()作为类的实例方法,必须将self作为第一个参数(代表实例本身),否则调用时会抛出参数不匹配的错误。


修复后的代码示例

class A:
    def __init__(self, a1, a2):
        self.a1 = a1
        self.a2 = a2
    def testa(self):  # 添加self参数
        print('inside A')

class B(A):
    def __init__(self, a1, a2, b1, b2):
        super().__init__(a1, a2)  # 调用父类A的构造方法
        self.b1 = b1
        self.b2 = b2
    def testb(self):  # 添加self参数
        print('inside B')

class C(B):
    def __init__(self, a1, a2, b1, b2, c1, c2):
        super().__init__(a1, a2, b1, b2)  # 调用父类B的构造方法
        self.c1 = c1
        self.c2 = c2
    def testc(self):  # 添加self参数
        print('inside C')

# 实例化时需要传递所有父类+子类的参数
obj = C(1, 2, 3, 4, 5, 6)
# 现在可以访问所有层级的实例变量
print(obj.a1, obj.a2, obj.b1, obj.b2, obj.c1, obj.c2)
# 调用实例方法
obj.testa()
obj.testb()
obj.testc()

关键说明

  • 使用super().__init__()是调用父类构造方法的推荐方式,它会自动处理继承链,无需硬编码父类名称。
  • 如果你不想在实例化C时传递过多参数,可以在子类的__init__中给父类参数设置默认值,比如:
    class C(B):
        def __init__(self, c1, c2, a1=0, a2=0, b1=0, b2=0):
            super().__init__(a1, a2, b1, b2)
            self.c1 = c1
            self.c2 = c2
    
    obj = C(1, 2)  # 此时a1/a2/b1/b2使用默认值0
    

内容的提问来源于stack exchange,提问作者Shashank Tripathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:00:53