【发布时间】:2011-10-12 01:56:15
【问题描述】:
考虑以下简单的示例类,它有一个属性,在调用时会公开一些内部数据的修改版本:
类Foo(对象):
def __init__(self, value, offset=0):
self._value = 价值
self.offset = 偏移量
@财产
默认值(自我):
返回 self._value + self.offset
@value.setter
定义值(自我,价值):
self._value = 价值
value.setter 适用于常规分配,但对于复合分配当然会失效:
>>> x = Foo(3, 2) >>> x.值 5 >>> x.value = 2 >>> x.值 4 >>> x.值 += 5 >>> x.值 11
期望的行为是x.value += 5 应该等效于x.value = x._value + 5,而不是x.value = x.value + 5。有什么方法可以纯粹在Foo 类中实现这一点(使用属性接口)?
【问题讨论】:
-
我建议不要从一开始就将神奇的数字行为添加到属性中,否则你会破坏对称性——正如你所注意到的——使用标准的数学运算符。定义
offsetValue()使读者的意图更加明显;特别是,x.value += 5是否应该添加到_value或offset? -
我用
if 'INPLACE_ADD' in [dis.opname[ord(op)] for op in inspect.stack()[1][0].f_code.co_code]:尝试了一些东西,然后才意识到setter的行为总体上是有缺陷的。我已经使用它这么久了,我没想到只是重新审视它。 -
如果没有这个偏移量,它似乎可以正常工作。我同意 ezod 的观点,即尝试将 add 的结果分配给计算属性时它正在做一些奇怪的事情。使用偏移量,它会产生意想不到的结果。没有它就没有。嗯。
标签: python