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

继承报错:'super'对象无属性,如何正确调用父类实例变量?

解决子类无法访问父类实例变量的问题

首先咱们来拆解下你遇到的问题:你的子类没法访问父类的实例变量,核心原因是子类的构造方法没有调用父类的构造方法,导致父类里的self.attr1和self.attr2根本没被初始化出来。另外还有几个小细节需要调整,咱们一步步来解决:

问题根源分析

  1. 父类构造未被调用:你的child_A和child_B的__init__方法里没有触发父类parent的__init__,所以父类定义的实例变量根本不会出现在子类实例中。你之前尝试加super().__init__但没生效?大概率是没加对位置——得在子类构造方法的开头先调用它。
  2. 错误的实例变量访问方式:你用super().attr1来访问父类实例变量是没必要的,子类继承父类后,直接用self.attr1就能访问父类的实例变量(只要父类构造已执行)。super()更多用于调用父类被重写的方法,而不是直接访问实例属性。
  3. 字符串比较的不严谨性:工厂类里用type is "A"来判断类型是不安全的,Python中字符串比较应该用==,is是用来判断两个对象是否是同一个内存地址,虽然多数情况下字符串常量池会让is生效,但这不是可靠的写法。

修正后的代码

class Factory:
    @staticmethod
    def fact(type_str):
        if type_str == "A":
            return ChildA()
        elif type_str == "B":
            return ChildB()
        # 增加异常抛出,避免无匹配类型时返回None引发后续问题
        raise ValueError(f"Unsupported type: {type_str}")

class Parent:
    def __init__(self):
        self.attr1 = []
        self.attr2 = []

class ChildA(Parent):
    def __init__(self):
        # 先调用父类构造方法,初始化父类的实例变量
        super().__init__()
        # 直接通过self访问父类的实例变量
        self.data = [self.attr1, self.attr2]

class ChildB(Parent):
    def __init__(self):
        super().__init__()
        self.data = [self.attr1, self.attr2]

验证效果

现在用工厂类创建实例,每个子类实例都会拥有独立的attr1、attr2和data,完全不会和其他实例共享数据:

a1 = Factory.fact("A")
a2 = Factory.fact("A")
a1.attr1.append(1)
print(a1.data)  # 输出 [[1], []]
print(a2.data)  # 输出 [[], []],两个实例的变量完全独立

额外说明

  • 我把类名改成了大驼峰格式(Factory、Parent、ChildA),这是Python类名的PEP8规范,代码可读性更强。
  • 工厂方法里补充了elif分支和异常抛出,能有效处理无效类型输入的情况。
  • 每个子类实例的attr1和attr2都是独立的列表,完美满足你“子类实例之间不共享数据”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:20:38