覆盖属性的getter和setter

时间:2018-05-29 12:08:02

标签: python python-3.x

我想覆盖子类中属性的getter和setter。请考虑以下python3代码段:

class Base():
    @property
    def value(self):
        return "Base.value"

    @value.setter
    def value(self, value):
        pass

class Child(Base):
    @Base.value.getter
    def value(self):
        return "Child.value"

    @Base.value.setter
    def value(self, value):
        pass

c = Child()
print(c.value)

此程序打印Base.value,表示value getter未被覆盖。但是,如果我删除value类中的Child setter,程序将打印Child.value,这意味着将覆盖getter。

这种覆盖属性的方法有什么问题?为什么修改setter会改变getter的行为?我怎样才能正确覆盖子类中的getter和setter?

1 个答案:

答案 0 :(得分:1)

根据我的观察,如果只需要覆盖setter(或getter),我认为你应该使用@ Base.value.setter(或.getter)装饰器。

如果必须覆盖两者,只需使用通常的@property方法。

class Base():
    def __init__(self):
        self._value = 'Value'

    @property
    def value(self):
        print('Base.Getter')
        return f'Base.{self._value}'

    @value.setter
    def value(self, value):
        print('Base.Setter')
        self._value = value

class Child(Base):
    @property
    #@Base.value.getter
    def value(self):
        print('Child.Getter')
        return f'Child.{self._value}'

    @value.setter
    #@Base.value.setter
    def value(self, value):
        print('Child.Setter')
        self._value = value

b, c = Base(), Child()
print(b.value)
print(c.value)
b.value = 'test.base'
c.value = 'test.child'
print(b.value)
print(c.value)

打印:

Base.Getter
Base.Value
Child.Getter
Child.Value
Base.Setter
Child.Setter
Base.Getter
Base.test.base
Child.Getter
Child.test.child