如何使子类使用父类的默认值?

2024-04-25 05:49:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个家长班:

class BaseClass:
    def __init__(self, foo, bar=10):
        self.foo = foo  

以及从中继承的类:

class InheritedClass(BaseClass):
    def __init__(self, x, y, bar=10):
        super().__init__(True, bar=bar)
        self.x = x
        self.y = y

目前,bar在父类和继承类中都有一个默认值,我必须跟踪它以确保它们都是同步的。如何将InheritedClass构造函数改为使用BaseClass中定义的bar的默认值


我试过:

class InheritedClass(BaseClass):
    def __init__(self, x, y, bar=None):
        if bar is None:
            super().__init__(True)
        else:
            super().__init__(True,bar)
        self.x = x
        self.y = y

它提供了我正在寻找的行为,但似乎没有很好的可伸缩性。有更好的办法吗


Tags: selfnonetrueif定义fooinitdef
3条回答

可以改用变量参数:

class InheritedClass(BaseClass):
    def __init__(self, x, y, *args, **kwargs):
        super().__init__(True, *args, **kwargs)
        self.x = x
        self.y = y

不要在签名中暴露父级的参数;把你收到的东西(如果有的话)传给MRO的下一堂课

class BaseClass:
    def __init__(self, foo, bar=10, **kwargs):
        super().__init__(**kwargs)
        # Do something with bar
        self.foo = foo


class InheritedClass(BaseClass):
    def __init__(self, x, y, **kwargs)
        kwargs['foo'] = True
        super().__init__(**kwargs)
        self.x = x
        self.y = y

您必须接受并传递任意关键字才能正确使用super,因此您也可以对父类的参数执行相同的操作,即使您已经“知道”了它们

这也意味着总是__init__使用关键字参数,因为您无法真正预测类的位置参数将如何与MRO上的另一个类交互(位置参数只能在先到先得的基础上使用,在多重继承的情况下,您根本不知道何时调用类的方法。)

foo = InheritedClass(bar=9, x=3, y=10)

你的方法不错,是的,有一个更好的方法来做它也许比我的更好,但这里是我提出的希望这有帮助

示例:

class BaseClass:
    def __init__(self, foo, bar=10):
        self.foo = foo 
        self.bar = bar 

class InheritedClass(BaseClass):
    def __init__(self, x, y, bar=None):
        super().__init__(True, bar=bar)
        if bar is None: bar = self.bar
        self.x = x
        self.y = y

相关问题 更多 >