Python 访问超类&x27;子类中的属性设置器

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

我有一个定义属性及其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中的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()。这应该是可行的,但添加了一种可能不需要的方法