继承报错:'super'对象无属性,如何正确调用父类实例变量?
解决子类无法访问父类实例变量的问题
首先咱们来拆解下你遇到的问题:你的子类没法访问父类的实例变量,核心原因是子类的构造方法没有调用父类的构造方法,导致父类里的self.attr1和self.attr2根本没被初始化出来。另外还有几个小细节需要调整,咱们一步步来解决:
问题根源分析
- 父类构造未被调用:你的
child_A和child_B的__init__方法里没有触发父类parent的__init__,所以父类定义的实例变量根本不会出现在子类实例中。你之前尝试加super().__init__但没生效?大概率是没加对位置——得在子类构造方法的开头先调用它。 - 错误的实例变量访问方式:你用
super().attr1来访问父类实例变量是没必要的,子类继承父类后,直接用self.attr1就能访问父类的实例变量(只要父类构造已执行)。super()更多用于调用父类被重写的方法,而不是直接访问实例属性。 - 字符串比较的不严谨性:工厂类里用
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
相关产品推荐
相关产品推荐

