在超类中创建一个变量,但不要覆盖继承者的设置
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"
我想要一个超类,作为其接口的一部分,提供一个变量(或 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"