У меня есть объект (Edge), который содержит два других объекта (точки A и B) в 3D.Геометрически ребро от A = (0, 0, 0) до B = (1, 0, 0) должно быть таким же, как ребро от A = (1, 0, 0) до B = (0, 0, 0), и легко сделать утверждение равенства двух ребер.Однако у меня возникли некоторые концептуальные проблемы, связанные с реализацией способа хеширования этого объекта (в Python).Например, hash ((A, B)) вернет значение, отличное от hash ((B, A)).
Я видел ответы о похожих проблемах на этом сайте, но все они включают созданиесравнение между двумя элементами.Я действительно не хочу этого делать, потому что, хотя я могу придумать строгий способ сравнения двух точек (сначала сравните координаты x, затем координаты y, если x равны, затем z, если y равны), я неНе знаю, хочу ли я осуществить сравнение, которое математически кажется бессмысленным и полезным только для этого единственного экземпляра.Утверждение (1, 0, 0)> (0, 300, 10 ^ 10) может быть правильным с этим методом, но оно не очень значимо.
class Edge(object):
def __init__(self, pointA, pointB):
self._A = pointA
self._B = pointB
ab = pointA + pointB
self._midpoint = Vector(ab.x / 2, ab.y / 2, ab.z / 2)
def get_A(self):
return self._A
def set_A(self, point):
self._A = point
def get_B(self):
return self._B
def set_B(self, point):
self._B = point
A = property(get_A, set_A)
B = property(get_B, set_B)
def __eq__(self, other):
if isinstance(other, Edge):
if (self.A == other.A) and (self.B == other.B):
return True
elif (self.B == other.A) and (self.A == other.B):
return True
else:
return False
def __ne__(self, other):
return not self.__eq__(other)
def __hash__(self):
return hash((self.A, self.B)) # =/= hash((self.B, self.A))!
def __str__(self):
return "[{}, {}]".format(self.A, self.B)
В заключение мне интересноесли есть реализация, которая даст двум эквивалентным ребрам одинаковое хеш-значение без создания какой-либо произвольной функции сравнения между точками.(PS мой класс "point" называется "Vector")