Python 访问超类&x27;子类中的属性设置器
我有一个定义属性及其setter的超类,如下所示:Python 访问超类&x27;子类中的属性设置器,python,inheritance,properties,overriding,Python,Inheritance,Properties,Overriding,我有一个定义属性及其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.set
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中的setter即可。有人对如何解决这个问题有什么建议吗?可能很简单,但我现在看不到:/getter和setter存储为
属性
对象的属性(分别为.fget
和.fset
),因此,只要在子类中重载属性,就可以最明确地提供getter和setter,即:
class B(A):
@property
def mode(self):
return self._mode
@mode.setter
def mode(self, value):
self._mode = value
因此,如果要使getter和/或setter可以重载,而不必重新声明属性,则必须定义\u get\u mode
方法,并使属性的getter委托给此方法,就像对setter所做的那样
class A(object):
def __init__(self):
self._mode = None
@property
def mode(self):
return self._get_mode()
def _get_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):
def _get_mode(self):
return self._mode
def _set_mode(self, value):
self._mode = value
与在
A
的定义中使用mode.setter
类似,对于一个相关的问题,建议使用基类的属性来定义子类上的属性,如下所示:
B(A)类:
@A.mode.getter#只更改了这一行!
def模式(自):
返回自我模式
定义设置模式(自身、值):
self.\u模式=值
在这里,
mode.setter
将与A
相同,但我们已经替换了getter。我刚刚想到,我可以像这样添加一个显式getter方法,并让mode属性调用此getter`return self.\u mode\u getter(),然后覆盖\u mode\u getter()。这应该是可行的,但添加了一种可能不需要的方法