在Python中覆盖继承属性的getter和setter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中覆盖继承属性的getter和setter相关的知识,希望对你有一定的参考价值。

我目前正在使用@property装饰器在我的几个班级中实现“getter and setters”。我希望能够在子类中继承这些@property方法。

我有一些Python代码(具体来说,我在py3k中工作),看起来有点模糊:

class A:
    @property
    def attr(self):
        try:
            return self._attr
        except AttributeError:
            return ''

class B(A):
    @property
    def attr(self):
        return A.attr   # The bit that doesn't work.

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

if __name__ == '__main__':
    b = B()
    print('Before set:', repr(b.attr))
    b.attr = 'abc'
    print(' After set:', repr(b.attr))

我已经标记了与评论无关的部分。我希望返回基类'attr getter。 A.attr返回一个属性对象(可能非常接近我需要的东西!)。

编辑: 在从Ned收到以下答案后,我想到了我认为对这个问题更优雅的解决方案。

class A:
    @property
    def attr(self):
        try:
            return self._attr
        except AttributeError:
            return ''

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

if __name__ == '__main__':
    b = B()
    print('Before set:', repr(b.attr))
    b.attr = 'abc'
    print(' After set:', repr(b.attr))

.setter装饰器需要一个属性对象,我们可以使用@A.attr。这意味着我们不必在子类中再次声明属性。

(这是在一天结束时处理问题与在一天开始时处理问题之间的区别!)

答案

我想你想要:

class B(A):
    @property
    def attr(self):
        return super(B, self).attr

你提到想要返回父类的getter,但你需要调用getter,而不是返回它。

另一答案

要覆盖python 2中的setter,我这样做了:

class A(object):
    def __init__(self):
        self._attr = None

    @property
    def attr(self):
        return self._attr

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


class B(A):
    @A.attr.setter
    def attr(self, value):
        # Do some crazy stuff with `value`
        value = value[0:3]
        A.attr.fset(self, value)

要了解A.attr.fset的来源,请参阅property类的文档:https://docs.python.org/2/library/functions.html#property

以上是关于在Python中覆盖继承属性的getter和setter的主要内容,如果未能解决你的问题,请参考以下文章

覆盖python中的属性

JS对象属性中get/set与getter/setter是什么

Python 抽象 setter 和 getter

覆盖 ExtJS 模型 getter 和 setter 的最佳实践

如何为python类中的私有属性编写getter-setter方法?

Python学习之面向对象进阶