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

时间:2019-04-24 17:29:55

标签: python python-3.x inheritance

我有一个家长班:

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构造函数,以改为使用bar中定义的BaseClass的默认值?


我尝试过:

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

可以提供我要寻找的行为,但似乎扩展性不高。有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以改用变量参数:

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

答案 1 :(得分:1)

在签名中完全不公开父级的参数;只需将您收到的内容(如果有的话)传递给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)

答案 2 :(得分:0)

您的方法还不错,是的,也许有比我更好的方法,但这是我想出的办法,希望对您有所帮助。

示例:

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