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

子类与父类变量同名时,如何访问父类的name变量?

解答

一、获取父类name的正确方法

首先修正原代码的明显错误:Child.__init__里的self.name = name中,name未定义,应改为传入的参数nombre。

super().name报错的核心原因是:name是实例属性,存储在实例对象(self)上,而非父类的类属性。super()是代理父类方法的对象,无法直接访问实例属性;且子类__init__中已经用self.name = nombre覆盖了父类__init__设置的self.name = 'a',实例上的name已经是子类的值。

要保留并获取父类的name,最直接的方式是在子类覆盖前先保存父类的值:

class Father():
    def __init__(self, name):
        self.name = name

class Child(Father):
    def __init__(self, nombre):
        super().__init__('a')  # 用super()调用父类构造方法更规范
        self.father_name = self.name  # 提前保存父类设置的name
        self.name = nombre  # 再设置子类自己的name

    def parents_name(self):
        return self.father_name  # 直接返回保存的父类name

如果不想新增属性,也可以通过父类构造逻辑直接获取(比如已知父类传入的固定值'a'),但这种方式灵活性差,不推荐。

二、是否属于良好实践?

  • 不推荐这种同名属性覆盖的做法:子类和父类使用同名实例属性存储不同含义的值,会严重降低代码的可读性和可维护性,容易引发混淆和逻辑错误。
  • 更优实践:给属性起明确的、区分性的名字,比如父类用father_name,子类用child_name,从根源上避免命名冲突;或者通过父类提供的方法来获取其属性值,而非直接依赖属性同名覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:10:12