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
相关产品推荐
相关产品推荐

