在超类中创建一个变量,但不要覆盖继承者的设置

Create a variable in a superclass, but don't overwrite inheritor's setting

我想要一个超类,作为其接口的一部分,提供一个变量(或 getter 函数),并允许(但 不需要 ) 一个继承者来设置这个值。如下:

class A(object):
    def __init__(self):
        self._value = DEFAULT_VALUE

    def value(self):
        return self._value

class B(A):
    def __init__(self, value):
        self._value = value
        super().__init__()

class C(A):
    def __init__(self):
        #note this class does not care about setting value
        super.__init__()

但是,super 的 init 将覆盖 B 所做的任何自定义设置。如果我不在超类中设置它,然后子类不想实现它,任何使用该变量的东西都会失败。

如何在超类中创建这个变量而不覆盖子类可能想要设置的变量?

编辑: 根据 Simon Hawe 的评论更新

你可以这样做:

class A(object):
    def __init__(self, value=DEFAULT_VALUE):
        self._value = value

    def value(self):
        return self._value

class B(A):
    def __init__(self, value):
        super().__init__(value)

现在,如果子类未向 super().__init__() 调用提供值,则 _value 将仅作为默认值。

如评论中所述,您可以在 after 调用 super().__init__:

后简单地进行特定于子类的初始化
class B(A):
    def __init__(self, value):
        super().__init__()
        # time to overwrite that default value
        self._value = value

如果不需要,您也可以 调用 super().__init__

class B(A):
    def __init__(self, value = None):
        if value is None:
            # fallback to default
            super().__init__()
        else:
            # otherwise set value from caller
            self._value = value

b = B()
print(b.value()) # prints the default value

b = B("overridden value")
print(b.value()) # prints "overridden value"