Python子类实例如何复用父类已创建实例的属性?求解
问题根源
你混淆了类继承和实例关联的概念:
- 你创建的
a是A类的一个独立实例,B继承的是A这个类,而不是继承a这个具体实例的属性。 B的__init__方法调用super().__init__()时,没有传递任何参数,所以会使用A类__init__方法里的默认值a=12,和你之前创建的a实例完全没关系。
解决方案
根据你的调度系统场景,分两种常见处理方式:
方式1:让B实例关联一个A实例(推荐,更符合OOP设计)
如果B是算法运行环境,需要访问某个调度系统实例的参数,应该把A的实例传递给B,而不是靠继承共享属性:
class A(): def __init__(self, a=12) -> None: self.a = a # 这里可以添加机器集合、作业集合等属性 self.machines = [] self.jobs = [] class B(): def __init__(self, scheduler: A) -> None: self.scheduler = scheduler # 关联调度系统实例 # 使用方式 a = A(a=16) b = B(scheduler=a) print(b.scheduler.a) # 输出16 # 后续可以通过b.scheduler访问调度系统的所有属性
方式2:让B继承A并复用指定A实例的参数
如果确实需要通过继承实现,你可以给B的__init__添加参数,或者直接传入已有的A实例的属性:
class A(): def __init__(self, a=12) -> None: self.a = a class B(A): def __init__(self, a=None) -> None: # 如果传入a就用传入的值,否则用默认 super().__init__(a=a if a is not None else 12) # 使用方式1:直接传参数 b = B(a=16) print(b.a) # 输出16 # 使用方式2:复用已有的A实例a的参数 a = A(a=16) b = B(a=a.a) print(b.a) # 输出16
额外建议
你的场景里,A是调度系统模型,B是算法运行环境,两者更适合用关联关系(方式1)而不是继承关系。继承应该用在"is-a"的关系(比如B是一种特殊的A),而你的场景里B是"uses-a" A,所以关联的设计更合理,也更易维护。
内容的提问来源于stack exchange,提问作者Jika
相关产品推荐
相关产品推荐

