子类调用同名父类属性报错,如何正确实现?
问题分析与解决
错误原因
你遇到的问题是super().name调用报错,核心原因有两点:
name是实例属性,存储在实例对象(self)中,而非父类的类对象里。当Child的__init__执行时,先通过super().__init__()给self.name赋值为"Parent",紧接着又将self.name重新赋值为"Child",此时实例中仅保留最后一次赋值的结果。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
相关产品推荐
相关产品推荐

