Python类继承问题:子类重复定义父类默认参数,实例属性未按预期传递
Python类继承构造函数问题解析
问题1:子类为何要重复定义父类的默认参数
Python里子类的__init__是独立的函数,父类的默认参数不会自动同步到子类的参数签名里。如果不想重复写默认值,有两种简洁的解决方式:
方案1:用*args和**kwargs传递参数
子类不单独声明参数,直接把所有参数传给父类,自动适配父类的参数定义:
class BaseCalculations(Base): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)
方案2:提取默认参数到父类类属性
把默认值存在父类的类变量中,子类直接引用,后续修改默认值只需改父类:
class Base(): DEFAULT_ARG1 = 0 DEFAULT_ARG2 = "" DEFAULT_ARG3 = False def __init__(self, arg1: int = DEFAULT_ARG1, arg2: str = DEFAULT_ARG2, arg3: bool = DEFAULT_ARG3): self.arg1 = arg1 self.arg2 = arg2 self.arg3 = arg3 class BaseCalculations(Base): def __init__(self, arg1: int = Base.DEFAULT_ARG1, arg2: str = Base.DEFAULT_ARG2, arg3: bool = Base.DEFAULT_ARG3): super().__init__(arg1, arg2, arg3)
问题2:子类实例的arg3为何输出False
这里核心误解是:每个类实例都是完全独立的对象。你创建的base是Base类的一个实例,调用base.set_arg3()只会修改这个实例的arg3;而calc是BaseCalculations的全新实例,它的arg3会用父类__init__的默认值False初始化,和base实例毫无关联。
如果想让BaseCalculations实例默认arg3=True,可以这样做:
方式1:子类初始化时主动设置
class BaseCalculations(Base): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_arg3() # 调用父类方法设置arg3为True
方式2:修改子类的默认参数值
直接在子类__init__里把arg3的默认值改成True:
class BaseCalculations(Base): def __init__(self, arg1: int = 0, arg2: str = "", arg3: bool = True): super().__init__(arg1, arg2, arg3)
内容的提问来源于stack exchange,提问作者Paul Hinterbauer
相关产品推荐
相关产品推荐

