Таким образом, у меня есть квадрат, это составлено из серии точек. В каждой точке существует соответствующее значение.
То, что я хочу сделать, создают словарь как это:
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 не полагает, что два объекта с теми же свойствами тот же объект? Есть ли какой-либо путь вокруг этого?Спасибо
Определите Point .__ hash __ ()
и Point .__ eq __ ()
, чтобы их можно было правильно сравнивать в dicts.
И пока вы это делаете, подумайте об определении Point .__ repr __ ()
, чтобы получить прилично выглядящие представления ваших объектов Point
.
Да, определите __ 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.
Любая причина не использовать просто кортеж:
>>> s={}
>>> s[1,2]=5
>>> s
{(1, 2): 5}
>>> s[1,2]
5