Python继承:能否为父类属性设置默认值?
解决方案:让子类自动继承父类带默认值的属性
当然可行!你的示例代码问题出在子类F2的__init__把sick设成了必填参数,所以创建实例时必须传入。我们可以通过几种方式实现“子类创建对象时无需传入sick,自动继承父类默认值”的需求,同时也聊聊类属性的适用场景。
方式一:子类__init__不接收sick参数,直接复用父类默认值
这是最直接的方案,子类初始化方法只接收自己需要的参数,调用父类初始化时不传sick,父类会自动使用默认值:
class F1(object): def __init__(self, sick="flu"): self.sick = sick class F2(F1): def __init__(self, cure): # 调用父类初始化,不传入sick,自动用父类的默认值"flu" super(F2, self).__init__() self.cure = cure # 创建子类对象时只需传入cure参数 a = F2("bed rest") print(a.sick) # 输出: flu print(a.cure) # 输出: bed rest
方式二:保留修改sick的灵活性,默认仍用父类值
如果偶尔需要给子类实例设置不同的sick,但默认还是用父类的,我们可以给子类的sick参数设默认值None,调用父类时做判断:
class F1(object): def __init__(self, sick="flu"): self.sick = sick class F2(F1): def __init__(self, cure, sick=None): # 如果传入了sick就用传入的值,否则用父类默认 super().__init__(sick) if sick is not None else super().__init__() self.cure = cure # 默认使用父类的sick a = F2("bed rest") print(a.sick) # 输出: flu # 手动指定sick的值 b = F2("antibiotic", sick="cold") print(b.sick) # 输出: cold
类属性是否更合适?看你的业务场景!
如果sick是所有父类、子类实例共享且无需个性化修改的属性,那用类属性确实更合适——它是所有实例共享的,节省内存,而且修改类属性会同步影响所有未单独重写该属性的实例:
class F1(object): sick = "flu" # 定义为类属性 class F2(F1): def __init__(self, cure): self.cure = cure a = F2("bed rest") print(a.sick) # 输出: flu # 修改类属性,所有未单独设置sick的实例都会跟着变 F1.sick = "cold" print(a.sick) # 输出: cold # 如果某个实例需要个性化sick,直接赋值即可(会覆盖类属性) a.sick = "fever" print(a.sick) # 输出: fever print(F2.sick) # 输出: cold(类属性本身没变)
总结
- 若每个实例的
sick可能不同,但默认值固定:用**父类__init__默认参数 + 子类不传sick**的方案 - 若
sick是所有实例共享的通用属性:用类属性更高效
内容的提问来源于stack exchange,提问作者netrate
相关产品推荐
相关产品推荐

