【问题标题】:python3: overriding setter of a propertypython3:覆盖属性的设置器
【发布时间】:2019-07-28 18:40:36
【问题描述】:
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,因为我在派生类中重写了它。

当我用谷歌搜索它时,我看到了带有 @Base.prop.setter 的注释。我也试过了,但是没有用。我认为这是因为他们创建Baseprop 的方式不同。

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

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

【问题讨论】:

    标签: python python-3.x inheritance properties


    【解决方案1】:

    这是因为当您使用property(get_prop, set_prop) 分配给Base.prop 时,此property 对象将使用set_prop 函数对象在Base 类中定义。 Derived 类继承 Base 类这一事实不会神奇地更新对 property 对象内的 Base.set_prop 方法的引用。

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

    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
    

    【讨论】:

    • 那么,唯一的办法就是在Derived 类中重新运行这个prop = property(get_prop, set_prop)
    • 我已经用一些可能的解决方案更新了我的答案。
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2017-08-29
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多