使用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