当使用属性来获取/设置属性列表时,似乎适用于单个对象的相同样板代码对容器不起作用。 (或者,确实如此,我做错了。)
示例:
>>> class A(object):
... def __init__(self, x, y):
... self.x = x
... self.y = y
... @property
... def pos(self):
... return [self.x, self.y]
... @pos.setter
... def pos(self, xy):
... self.x, self.y = xy
...
>>> Stick = A(10, 20)
>>> Stick.x
10
>>> Stick.y
20
>>> Stick.pos
[10, 20]
>>> Stick.pos = [5, 10]
>>> Stick.x
5
>>> Stick.y
10
>>> Stick.pos
[5, 10]
到目前为止一切顺利;但是,在尝试分配给Stick.pos[0]
时,我遇到了麻烦。
>>> Stick.pos[0] = 70
>>> Stick.x
5
>>> Stick.pos
[5, 10]
现在,当然,一个可能根本就不会这样做而只是直接分配到obj.x
,但它确实让我想知道如果要假设这样做应该怎么做只允许obj.pos
属性进行分配。 是否有办法在obj.pos[i]
属性时成功分配给pos
?
答案 0 :(得分:3)
这不起作用,因为当你调用Stick.pos[0]
时,你正在调用pos
的getter,它返回一个列表对象,其中有两个整数等于self.x
和{{1但不是对self.y
和self.x
的实际引用。该列表的状态不会在您的类内部维护,因此您对其所做的更改将丢失。
但是,您可以通过在self.y
内部存储x
和y
并使用list
获取/设置它们来获得此行为:
property
输出:
class A(object):
def __init__(self, x, y):
self.xy = [x, y]
@property
def pos(self):
return self.xy
@pos.setter
def pos(self, xy):
self.xy = xy
@property
def x(self):
return self.xy[0]
@x.setter
def x(self, x):
self.xy[0] = x
@property
def y(self):
return self.xy[1]
@y.setter
def y(self, y):
self.xy[1] = y