gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:12:22 25 4
gpt4 key购买 nike

我目前正在使用 @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 获得的属性对象。这意味着我们不必在子类中再次声明该属性。

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

最佳答案

为了覆盖 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 - 在 Python 中覆盖继承属性的 getter 和 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3336767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com