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

新手上路,请多包涵

我正在尝试在 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

它应该像这样工作:

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

我说得对吗,` setitem () 应该像这样工作吗?谢谢!

原文由 John Berry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 416
2 个回答

self.data 并且只有 self.data 保存坐标值。 If self.x and self.y were to also store these values there is a chance self.data and self.x or self.y will无法持续更新。

相反,使 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]


该声明

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

很有趣但有问题。让我们把它分开:

[self.x, self.y] 导致 Python 构建一个 新列表,其值为 self.xself.y

somelist[x]=y causes Python to assign value y to the x th index of somelist .所以这个新列表 somelist 得到更新。但这对 self.dataself.xself.y 没有影响。这就是为什么您的原始代码不起作用的原因。

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是一篇很老的文章,但是您的问题的解决方案非常简单:

 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.__dict__[item]

    def __setitem__(self,item,value):
        self.__dict__[item] = value

每个类都有自己的字典,其中包含在类内部创建的所有属性和方法。因此,您可以调用:

 In [26]: p=point(1,1)
In [27]: print p
point(1,1)
In [28]: p['x']=2
In [29]: print p
point(2,1)
In [30]: p['y']=5
In [31]: print p
point(2,5)

它比你的“索引”更可读,比如参考。

原文由 Gregory 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题