关于python:了解父元素属性setter的继承

Understanding inheritance of parent's attribute setter

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

1
2
3
4
5
6
7
8
9
10
11
12
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的属性设置器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.')

上面有什么不同吗?


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

实际上,@property.getter@property.setter@property.deleter装饰器都是经过精心设计的,考虑到了这个确切的使用案例。来自文档:

A property object has getter, setter, and deleter methods usable as
decorators that create a copy of the property with the corresponding
accessor function set to the decorated function.

(强调我的)

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

总的来说,最好使用@Parent.attribute.setter解决方案,因为它减少了代码重复——将父类的getter粘贴到子类中的复制只不过是潜在的bug源。

相关问题:

  • 在python中使用属性的getter
  • 不带setter的python重写getter
  • 重写python中的属性