用于Point(x,y)类的Python中的__setitem__实现

Joh*_*rry 4 python python-2.7

我正在尝试在python中创建一个Point类.我已经有了一些函数,比如__ str__或__ getitem__,它运行得很好.我面临的唯一问题是我的__ setitem__的实现不起作用,其他人都做得很好.

这是我的Point类,最后一个函数是我的__ setitem__:

class point(object):
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y

    def __str__(self):
        return "point(%s,%s)"%(self.x,self.y)

    def __getitem__(self,item):
        return (self.x, self.y)[item]

    def __setitem__(self,x,y):
        [self.x, self.y][x]=y
Run Code Online (Sandbox Code Playgroud)

它应该像这样工作:

p=point(2,3)
p[0]=1 #sets the x coordinate to 1
p[1]=10 #sets the y coordinate to 10
Run Code Online (Sandbox Code Playgroud)

(我甚至是对的,如果setitem像这样工作吗?)谢谢!

unu*_*tbu 7

设置self.data并仅self.data保持坐标值.如果self.xself.y是还存储这些值是有机会self.dataself.xself.y将不会持续更新.

相反,make xy 属性可以查找其值self.data.

class Point(object):
    def __init__(self,x=0,y=0):
        self.data=[x, y]

    def __str__(self):
        return "point(%s,%s)"%(self.x,self.y)

    def __getitem__(self,item):
        return self.data[item]

    def __setitem__(self, idx, value):
        self.data[idx] = value

    @property
    def x(self):
        return self.data[0]

    @property
    def y(self):
        return self.data[1]
Run Code Online (Sandbox Code Playgroud)

该声明

[self.x, self.y][x]=y
Run Code Online (Sandbox Code Playgroud)

有趣但有问题.让它分开:

[self.x, self.y]导致Python构建一个新的列表,包含值self.xself.y.

somelist[x]=y导致Python来值分配yx的个索引somelist.所以这个新列表somelist会更新.但是,这有没有影响self.data,self.xself.y.这就是你的原始代码不起作用的原因.