使用super()在子级中重新实现父级的属性设置器

时间:2018-08-16 09:49:48

标签: python python-3.x super

在尝试在子类中设置属性时,我想提出一个NotImplementedError。这是代码:

class Parent():

    def __init__(self):
        self._attribute = 1

    @property
    def attribute(self):
        return self._attribute

    @attribute.setter
    def attribute(self, value):
        self._attribute = value


class Child(Parent):

    @Parent.attribute.setter
    def attribute(self, value):
        raise NotImplementedError('Not implemented.')

是否有一种方法可以使用Child重新实现super()的属性设置器,而不是直接引用Parent

1 个答案:

答案 0 :(得分:2)

您不能直接在super()语句块的顶层使用class,因为此时class尚不存在。

快速简单的解决方案是使您的Parent属性设置器委托给另一种方法,即:

class Parent():
    def __init__(self):
        # note that you can use the property here,
        # no need to break encapsulation.
        self.attribute = 1

    @property
    def attribute(self):
        return self._attribute

    @attribute.setter
    def attribute(self, value):
        self._set(value) 

    def _set(self, value):
        self._attribute = value

然后,您只需在子类中覆盖_set(self),就象其他任何普通方法一样:

class Child(Parent):
    def _set(self, value):
        raise NotImplementedError