John Berry John Berry - 1 year ago 121
Python Question

__setitem__ implementation in Python for Point(x,y) class

I'm trying to make a Point class in python. I already have some of the functions, like __ str__ , or __ getitem__ implemented, and it works great.
The only problem I'm facing is that my implementation of the __ setitem__ does not work, the others are doing fine.

Here is my Point class, and the last function is my __ setitem__:

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

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

it should work like this:

p[0]=1 #sets the x coordinate to 1
p[1]=10 #sets the y coordinate to 10

(Am I even right, should the setitem work like this?)

Answer Source

Let and only hold the coordinate values. If self.x and self.y were to also store these values there is a chance and self.x or self.y will not get updated consistently.

Instead, make x and y properties that look up their values from

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

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

    def __getitem__(self,item):

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

    def x(self):

    def y(self):

The statement

[self.x, self.y][x]=y

is interesting but problematic. Let pick it apart:

[self.x, self.y] causes Python to build a new list, with values self.x and self.y.

somelist[x]=y causes Python to assign value y to the xth index of somelist. So this new list somelist gets updated. But this has no effect on, self.x or self.y. That is why your original code was not working.