子类与父类变量同名时,如何访问父类的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
相关产品推荐
相关产品推荐

