属性是列表,分配给索引

时间:2014-07-08 16:11:44

标签: python python-2.7 properties

当使用属性来获取/设置属性列表时,似乎适用于单个对象的相同样板代码对容器不起作用。 (或者,确实如此,我做错了。)

示例:

>>> 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

1 个答案:

答案 0 :(得分:3)

这不起作用,因为当你调用Stick.pos[0]时,你正在调用pos的getter,它返回一个列表对象,其中有两个整数等于self.x和{{1但不是对self.yself.x的实际引用。该列表的状态不会在您的类内部维护,因此您对其所做的更改将丢失。

但是,您可以通过在self.y内部存储xy并使用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