了解父级属性设置器的继承

时间:2018-08-16 09:41:27

标签: python python-3.x inheritance

在尝试在子类中设置属性时,我想提出一个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

我看到我可以定义一个Child,它可以通过执行以下任一操作直接覆盖Parent的属性设置器:

class ChildA(Parent):

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


class ChildB(Parent):

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

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

以上两者之间是否有区别?

1 个答案:

答案 0 :(得分:1)

这两种解决方案之间没有区别。

实际上,@property.getter@property.setter@property.deleter装饰器是经过精心设计的,并牢记了这个确切的用例。来自the docs

  

属性对象具有gettersetterdeleter方法,可用作   装饰器创建属性的副本,并带有相应的   访问器功能设置为修饰功能。

(强调我的。)

因此,不可以,使用@Parent.attribute.setter不会影响Parent类的行为。

总体而言,最好使用@Parent.attribute.setter解决方案,因为它可以减少代码重复-将父类的getter复制粘贴到子类中只是潜在的错误来源。


相关问题: