如何实现父类默认属性值的继承并支持子类实例化时传入属性参数
如何实现父类默认属性值的继承并支持子类实例化时传入属性参数
这个问题我之前也碰到过,我来给你拆解一下问题出在哪,以及怎么解决~
首先,咱们先搞懂你现在报错的原因:你调用emp = Employe('a', 'b', 'c')时传了3个位置参数,但你的Employe.__init__定义是def __init__(self, position="boss", **kwargs):——这里除了self,只接受1个可选的位置参数position,剩下的必须是关键字参数。你一下子传3个位置参数,Python找不到对应的参数来接收,自然就报“参数数量不匹配”的错了。
接下来,咱们来解决核心需求:既要继承父类的默认属性值,又能在子类实例化时灵活传入父类/子类的属性。我给你两种实用的实现方案,你可以根据自己的使用习惯选:
方案一:显式声明父类参数(推荐,可读性更高)
这种方式把父类的name和age作为子类构造函数的可选参数,默认值设为None——当你没传这些参数时,父类会自动用它自己的默认值;传了的话就用你传入的值。
修改后的子类代码:
class Employe(Person): def __init__(self, position="boss", name=None, age=None): # 只把子类收到的非None参数传给父类,没传的话父类用自己的默认值 super_kwargs = {} if name is not None: super_kwargs["name"] = name if age is not None: super_kwargs["age"] = age super().__init__(**super_kwargs) self.position = position
这样用起来就很灵活了:
# 全用默认值 emp1 = Employe() emp1.person_info() # 输出:I'm Duck and 2 y.o. emp1.employe_info() # 输出:boss # 只传子类的position参数 emp2 = Employe("engineer") emp2.person_info() # 输出:I'm Duck and 2 y.o. emp2.employe_info() # 输出:engineer # 传position+父类的name、age emp3 = Employe("manager", "Charlie", 35) emp3.person_info() # 输出:I'm Charlie and 35 y.o. emp3.employe_info() # 输出:manager # 混合关键字参数(更清晰,推荐) emp4 = Employe(name="David", position="designer") emp4.person_info() # 输出:I'm David and 2 y.o.
方案二:用*args接收父类位置参数(更灵活,但可读性稍弱)
如果你想完全兼容父类的位置参数传递方式,可以用*args来接收所有给父类的位置参数,再传给父类的构造函数:
class Employe(Person): def __init__(self, *args, position="boss", **kwargs): # 把所有位置参数和关键字参数传给父类 super().__init__(*args, **kwargs) self.position = position
使用示例:
# 先传父类的name、age,再传子类的position emp5 = Employe("Eve", 28, position="tester") emp5.person_info() # 输出:I'm Eve and 28 y.o. emp5.employe_info() # 输出:tester # 只传关键字参数 emp6 = Employe(age=30, position="analyst") emp6.person_info() # 输出:I'm Duck and 30 y.o.
这里要注意:如果你像之前那样写emp = Employe('a', 'b', 'c'),第三个参数'c'会被当成父类的参数,但父类的构造函数只接受name和age两个参数,还是会报错——所以这种写法本身就不符合逻辑,你得明确哪些参数是给父类的,哪些是给子类的~
备注:内容来源于stack exchange,提问作者aleksandr
相关产品推荐
相关产品推荐

