【发布时间】:2017-08-03 10:45:51
【问题描述】:
我有一个 SuperClass,它定义了一个属性,它是 setter,如下所示:
class A(object):
def __init__(self):
self._mode = None
@property
def mode(self):
# to be overriden in subclass to implement the actual getter code
raise NotImplementedError
@mode.setter
def mode(self, value):
# common assertions and input validations
self._set_mode(value)
def _set_mode(self, value):
# to be overriden in subclass to implement the actual setter code
raise NotImplementedError
class B(A):
@property
def mode(self):
return self._mode
def _set_mode(self, value):
self._mode = value
obj = B()
obj.mode = 'test'
这引发了
obj.mode = 'test'
AttributeError: can't set attribute
看来我必须在 B 中注册一个 setter。我通常会像 @A.mode.setter 一样这样做,但这在这里并不完全适用,因为我实际上并不想在 B 中定义一个新的 setter,只需重新使用 A 中的那个。
有没有人提示如何解决这个问题?可能是微不足道的,但我现在没有看到它:/
【问题讨论】:
-
我突然想到我可以像这样添加一个显式的 getter 方法,并让 mode 属性调用这个 getter `return self._mode_getter(),然后覆盖 _mode_getter()。这应该可以,但添加了一个可能不需要的方法
标签: python inheritance properties overriding