Python子类与父类同名属性能否独立存在?如何访问父类同名属性?
Python子类与父类同名属性的处理
核心问题解答
1. 子类与父类的同名实例属性能否独立存在?
不能。Python的实例属性存储在实例的__dict__字典中,当子类实例对同名属性赋值时,会直接覆盖父类在初始化时设置的属性值,无法像Java那样让子类和父类的同名实例属性各自独立存储。
2. 如何实现类似Java的访问效果?
如果需要同时获取父类和子类的同名属性值,有两种可行方案:
方案一:在子类初始化时保存父类属性值
修改子类的__init__方法,在覆盖父类属性前先保存原值,后续即可直接访问:
# python 2/3 class Parent: def __init__(self): self.x = 1 class Child(Parent): def __init__(self): super(Child, self).__init__() self.parent_x = self.x # 保存父类设置的x值 self.x = 2 def getX(self): super_x = self.parent_x # 访问保存的父类属性值 print("super.x={} Child.x={}".format(super_x, self.x)) Child().getX() # 输出:super.x=1 Child.x=2
方案二:使用类属性替代实例属性
将父类和子类的x定义为类属性,此时子类和父类的类属性是独立的,可通过super()访问父类的类属性:
# python 2/3 class Parent: x = 1 # 父类类属性 class Child(Parent): x = 2 # 子类类属性 def getX(self): super_x = super().x # 访问父类的类属性 print("super.x={} Child.x={}".format(super_x, self.x)) Child().getX() # 输出:super.x=1 Child.x=2
与Java代码的对比
Java中,子类和父类的同名实例变量会分别存在于各自的类结构中,子类可以通过super.x直接访问父类的实例变量,无需额外处理,这是因为Java的属性查找机制与Python不同:
// java code public class Parent { int x=1; } public class Child extends Parent { int x = 2; void getX() { System.out.println("super.x=" + super.x + " Child.x=" + x); } public static void main(String[] args) { // output "super.x=1 Child.x=2" (new Child()).getX(); } }
内容的提问来源于stack exchange,提问作者yichudu
相关产品推荐
相关产品推荐

