Доступ к словарю оценивает значением пользовательского объекта в Python?

Таким образом, у меня есть квадрат, это составлено из серии точек. В каждой точке существует соответствующее значение.

То, что я хочу сделать, создают словарь как это:

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y


square = {}    
for x in range(0, 5):
        for y in range(0, 5):
            point = Point(x,y)
            square[point] = None

Однако, если я позже создаю новый точечный объект и попытку получить доступ к значению словаря с ключом той точки, это не работает..

>> square[Point(2,2)]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    square[Point(2,2)]
KeyError: <__main__.Point instance at 0x02E6C378>

Я предполагаю, что это вызвано тем, что Python не полагает, что два объекта с теми же свойствами тот же объект? Есть ли какой-либо путь вокруг этого?Спасибо

7
задан Sam 9 April 2010 в 03:12
поделиться

3 ответа

Определите Point .__ hash __ () и Point .__ eq __ () , чтобы их можно было правильно сравнивать в dicts.

И пока вы это делаете, подумайте об определении Point .__ repr __ () , чтобы получить прилично выглядящие представления ваших объектов Point .

12
ответ дан 6 December 2019 в 08:42
поделиться

Да, определите __ eq __ и __ hash__ методы в вашем классе Point.

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    def __eq__(self, other):
        return self._x == other._x and self._y == other._y

    def __hash__(self):
        #This one's up to you, but it should be unique. Something like x*1000000 + y.
5
ответ дан 6 December 2019 в 08:42
поделиться

Любая причина не использовать просто кортеж:

>>> s={}
>>> s[1,2]=5
>>> s
{(1, 2): 5}
>>> s[1,2]
5
2
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: