cas*_*asr 29 python properties
我目前正在使用@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))
Run Code Online (Sandbox Code Playgroud)
我已经标记了与评论无关的部分.我希望返回基类'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))
Run Code Online (Sandbox Code Playgroud)
该.setter装饰希望我们可以得到使用属性对象@A.attr.这意味着我们不必在子类中再次声明属性.
(这是在一天结束时处理问题与在一天开始时处理问题之间的区别!)
jma*_*son 28
要覆盖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)
Run Code Online (Sandbox Code Playgroud)
要了解A.attr.fset该property课程的来源,请参阅该课程的文档:https:
//docs.python.org/2/library/functions.html#property
我想你要:
class B(A):
@property
def attr(self):
return super(B, self).attr
Run Code Online (Sandbox Code Playgroud)
您提到要返回父类的getter,但是您需要调用getter而不是返回它。