首页 > 解决方案 > 子类覆盖父参数

问题描述

情况:我有一个函数,我想要一个只有一个不同默认参数的孩子。是否可以不重写每个参数而只重写我想要更改的参数?

class Weapon():
    def __init__(self, weight=12, ammo=22, name="shotgun",useful=True, broken=False, needed_lvl=5, range=2, price=233):
        pass # A LOT OF STUFF NOT INTERESTING FOR THIS EXAMPLE

有效的答案但效率不高:无用的重复信息,如果父项中的一件事发生变化,很容易被打破。

class ShotGun(Weapon):
    def __init__(self, weight=12, ammo=12, name="shotgun",useful=True, broken=False, needed_lvl=5, range=2, price=233):
        pass # A LOT OF STUFF NOT INTERESTING FOR THIS EXAMPLE

通缉答案:如果用户不更改任何内容,则参数的默认值ammo应为12.

class ShotGun(Weapon):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        pass # A LOT OF STUFF NOT INTERESTING FOR THIS EXAMPLE

标签: pythonclassinheritance

解决方案


您只能覆盖特定参数。只需将其他所有内容传递给super().__init__(). 但是您仍然需要在子类中设置 overriden 属性才能使新的默认值生效:

class Weapon():
    def __init__(self, weight=12, ammo=22, name="shotgun",useful=True, broken=False, needed_lvl=5, range=2, price=233):
        self.ammo = ammo
        self.name = "shotgun"


class ShotGun(Weapon):
    def __init__(self, ammo=12, **kwargs): # override only ammo
        super().__init__(**kwargs)
        self.ammo = ammo                   # use overriden value instead of parent

s = ShotGun()
print(s.ammo)
print(s.name)

输出:

12
shotgun

推荐阅读