使用同名的@property覆盖基类属性

时间:2015-07-11 17:39:09

标签: python properties subclass

我正在尝试子类化python类并使用@property函数覆盖常规属性。问题是我不能修改父类,子类的api需要看起来与父类相同(但行为不同)。 (所以我的问题不同于this one,其中父类也使用@property方法来访问底层属性。)

最简单的例子是

# assume this class can't be overwritten
class Parent(object):
    def __init__(self, a):
        self.attr = a

# how do I make this work?
class Child(Parent):
    def __init__(self, a):
        super(Child, self).__init__(a)

    # overwrite access to attr with a function
    @property
    def attr(self):
        return super(Child, self).attr**2

c = Child(4)
print c.attr # should be 16

调用父 init 方法时会产生错误。

<ipython-input-15-356fb0400868> in __init__(self, a)
      2 class Parent(object):
      3     def __init__(self, a):
----> 4         self.attr = a
      5 
      6 # how do I make this work?

AttributeError: can't set attribute

希望很明显我想做什么以及为什么。但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:1)

通过添加setter方法

可以轻松解决这个问题
class Child(Parent):
    def __init__(self, a):
        self._attr = None
        super(Child, self).__init__(a)

    # overwrite access to a with a function
    @property
    def attr(self):
        return self._attr**2

    @attr.setter
    def attr(self, value):
        self._attr = value