【发布时间】:2014-06-10 21:34:19
【问题描述】:
从Python documentation,我看到你可以设置透明处理属性的方法:
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
现在假设C._x 是一个列表。在 init 中它被简单地设置为[]。因此,如果我执行以下操作:
c = C()
c.x = [1,2,3]
c.x 将设置为 [1,2,3]。我现在想做的是
#...
c.x += 4
所以c.x 现在是[1,2,3,4]。这个例子很简单,但很明显,我希望setx 和getx 方法包括某种处理和检查。否则,使用这种方法将是愚蠢的。
编辑:在C 上使用__add__ 方法来强制执行该行为可能就足够了,但我想知道是否可以将行为放在属性上而不是全班
【问题讨论】:
-
你测试了吗?这对我来说似乎工作得很好。抱歉,我用
[4]进行了测试。发布了更多 cmets 和答案。 -
不,不应该,如果
c.x是一个列表,因为[1, 2, 3] + 4不合法,你需要将4 包装在一个列表中:[1, 2, 3] + [4]。含义:c.x += [4]有效。 -
不会的。我会得到 TypeError: int is not iterable,因为我不能将 4 添加到 [1,2,3]。我可以做 c.x += [4],但这不是我想要的
-
该问题与物业无关。如果您可以诱使列表接受该语法,则该属性也将起作用。换句话说,将类和属性排除在等式之外,并使用
x = [1, 2, 3]; x += 4并使其正常工作。当你有这个工作时,该属性也会工作。 -
你需要为这个重载 ````__iadd__``` 运算符(对于列表类型,因为没有 += 功能。因此,创建自己的列表类型并重载运算符。您无法在属性内实现此功能,请参阅stackoverflow.com/questions/19959359/…
标签: python class properties