在Python中重载属性setter

时间:2017-05-24 17:13:54

标签: python properties setter

使用Python 3,我想在子类中重载属性setter(添加指令)。 以下代码似乎正确,但运行它会引发AttributeError: 'super' object has no attribute 'value'

class Base(object):
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, val):
        self._value = val


class Child(Base):
    def __init__(self):
        super().__init__()
        self._double = 0

    @property
    def value(self):
        # I don't want to rewrite the getter so I call super
        return super().value

    @value.setter
    def value(self, val):
        # Get in trouble here
        super().value = val
        self._double = val * 2


c = Child()
c.value  # prints 0
c.value = 1  # raises error

我无法在重载的setter中使用self.value = val,因为它会导致RecursionError

我做错了什么?

编辑:我不认为这个问题与上述问题重复。 我的问题是:"我可以覆盖子类中的setter并调用父类,而不重写相同的赋值吗?"

这就是为什么我尝试super().value = val代替self._value = val

为什么return super().value有效,而super().value = val不是?

答案

(因为它标记为重复,我无法发布答案,所以这里是:)

在这里得到答案:How to call a property of the base class if this property is being overwritten in the derived class?

简而言之:使用Base.value.fset(self, val)代替super().value = val

class Child(Base):
    def __init__(self):
        super().__init__()
        self._double = 0

    @Base.value.setter
    def value(self, val):
        Base.value.fset(self, val)
        self._double = val * 2

0 个答案:

没有答案