python3:覆盖属性的setter

时间:2019-03-07 00:30:14

标签: python python-3.x inheritance properties

class Base:
    def __init__(self):
        self._prop = None
        pass

    def get_prop(self):
        print('base get prop')
        return self._prop

    def set_prop(self, prop):
        print('base set prop')
        self._prop = prop

    prop = property(get_prop, set_prop)
    pass


class Derived(Base):
    def set_prop(self, prop):
        print('Derived set prop')
        self._prop = prop
    pass


base = Base()
base.prop = 1
print(base.prop)

derive = Derived()
derive.prop = 1
print(derive.prop)

结果:

base set prop
base get prop
1
base set prop
base get prop
1

期望得到Derived set prop,因为我在派生类中重写了它。

当我用Google搜索它时,看到带有@Base.prop.setter的注释。我也尝试过,但是没有用。我认为这是因为它们如何创建Base的{​​{1}}是不同的。

但是在这种情况下,我无法轻松更新prop类。

一种方法是在Base类中完全重新实现prop,但是我知道这不是正确的方法。还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

这是因为当您用Base.prop分配给property(get_prop, set_prop)时,该property对象被set_prop类中定义的Base函数对象实例化了。 Derived类继承了Base类这一事实并不能神奇地更新Base.set_prop对象中对property方法的引用。

您可以在prop类内定义另一个Derived

class Derived(Base):
    def set_prop(self, prop):
        print('Derived set prop')
        self._prop = prop

    prop = property(Base.get_prop, set_prop)

或者您可以简单地使用property作为修饰符:

class Base:
    def __init__(self):
        self._prop = None
        pass

    @property
    def prop(self):
        print('base get prop')
        return self._prop

    @prop.setter
    def prop(self, prop):
        print('base set prop')
        self._prop = prop

class Derived(Base):
    @Base.prop.setter
    def prop(self, prop):
        print('Derived set prop')
        self._prop = prop