Python中如何让多个子类共享同一个父类实例及公共变量
问题根源
你对继承的理解存在偏差:Python 中的继承是类层面的属性/方法复用机制,每次实例化子类时都会生成完全独立的实例对象,你在__init__方法中赋值给self.xxx的属性都属于当前实例独有,不同实例之间天然互不影响,所以你原来的代码才会输出两个不同的值。
解决方案
方案1:使用父类类属性实现全局共享
如果你的需求是所有子类实例全局共享相同的变量,可以直接把需要共享的变量定义为父类的类属性,不要在__init__中赋值给实例本身:
class Parent: # 类属性属于父类本身,所有子类实例共享同一份 var1 = None class Child1(Parent): def __init__(self, var1): # 直接修改父类的类属性,所有子类实例都会同步变更 Parent.var1 = var1 class Child2(Parent): def __init__(self, var1): Parent.var1 = var1 child1 = Child1(1) print(child1.var1) # 输出1 child2 = Child2(2) print(child1.var1) # 输出2 print(child2.var1) # 输出2
该方案实现简单,不需要额外传参,缺点是类属性为全局共享,无法实现多组子类实例分别共享不同的变量。
方案2:通过组合持有同一个父类实例
如果你需要更灵活的分组共享能力,推荐使用你后续要学习的组合模式:先实例化父类,再把同一个父类实例传给所有需要共享变量的子类:
class Parent: def __init__(self): self.var1 = None class Child1: def __init__(self, parent: Parent, var1): self.parent = parent self.parent.var1 = var1 @property def var1(self): return self.parent.var1 class Child2: def __init__(self, parent: Parent, var1): self.parent = parent self.parent.var1 = var1 @property def var1(self): return self.parent.var1 # 实例化公共父类,传给所有需要共享变量的子类 shared_parent = Parent() child1 = Child1(shared_parent, 1) child2 = Child2(shared_parent, 2) print(child1.var1) # 输出2 print(child2.var1) # 输出2 # 需要独立分组时再实例化新的父类即可 another_parent = Parent() child3 = Child1(another_parent, 3) print(child3.var1) # 输出3,和前两个实例互不影响
该方案耦合度低、灵活性高,是这类场景更推荐的实现方式。
内容的提问来源于stack exchange,提问作者Jonas M.
相关产品推荐
相关产品推荐

