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

子类调用同名父类属性报错,如何正确实现?

问题分析与解决

错误原因

你遇到的问题是super().name调用报错,核心原因有两点:

  1. name是实例属性,存储在实例对象(self)中,而非父类的类对象里。当Child的__init__执行时,先通过super().__init__()给self.name赋值为"Parent",紧接着又将self.name重新赋值为"Child",此时实例中仅保留最后一次赋值的结果。
  2. super()返回的是父类的代理对象,它仅能用于调用父类的方法或访问父类的类属性,无法直接访问实例属性。

解决方法

方法1:覆盖前保存父类实例属性值

在Child的__init__中,先把父类设置的self.name保存到独立属性,再覆盖原name:

class Parent:
    def __init__(self):
        self.name = "Parent"

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.parent_name = self.name  # 保存父类设置的name值
        self.name = "Child"

    def print_names(self):
        print("Child name:", self.name)
        print("Parent name:", self.parent_name)

child = Child()
child.print_names()

方法2:将父类name改为类属性

如果父类的name不需要随实例变化,可定义为类属性,这样就能通过super()直接访问:

class Parent:
    name = "Parent"  # 定义为类属性
    def __init__(self):
        pass

class Child(Parent):
    def __init__(self):
        self.name = "Child"  # 实例属性覆盖类属性

    def print_names(self):
        print("Child name:", self.name)
        print("Parent name:", super().name)

child = Child()
child.print_names()

方法3:使用独立属性名区分

给父类和子类的属性设置不同名称,避免覆盖冲突:

class Parent:
    def __init__(self):
        self.parent_name = "Parent"

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.child_name = "Child"

    def print_names(self):
        print("Child name:", self.child_name)
        print("Parent name:", self.parent_name)

child = Child()
child.print_names()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:11