【发布时间】:2011-03-21 04:32:00
【问题描述】:
我目前正在使用@property 装饰器在我的几个类中实现“getter 和 setter”。我希望能够在子类中继承这些@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 获得它。这意味着我们不必在子类中再次声明该属性。
(这是在一天结束时解决问题与在一天开始时解决问题之间的区别!)
【问题讨论】:
-
我遇到了同样的问题,并且可以确认您的答案有效,但是哇,这是一个 $hitty 的“功能” - 添加超类名称链接!这对 python 来说是一个糟糕的设计。要么,要么“重新实现”该属性。两者都是糟糕的继承“解决方案”。
-
哇!谢谢
@A.attr.setter。我先试了@super.attr.setter这不行...
标签: python properties