Ваши классы могут, если хотите, определять __hash__
и методы сравнения (наиболее важно __eq__
), чтобы они были согласованы друг с другом и были "стабильными" - т. Е. Равенство двух объектов не должно изменяться по объектам «время жизни и, конечно же, ни одно из значений хеш-функции каждого объекта не должно меняться в течение срока службы объекта.
Требование согласованности: a==b
must подразумевает hash(a)==hash(b)
(обратное не требуется, и действительно редко).
Так что, если вы согласны с этими требованиями, простейшей реализацией будет:
class Item2(DictMixin):
def __hash__(self): return hash(id(self))
def __eq__(self, x): return x is self
def __ne__(self, x): return x is not self
в таком случае это также автоматически будет взаимодействовать с вашим классом Item1
, потому что это реализация хеширования и сравнения по умолчанию для классов, которые не наследуют или не определяют другие версии (так как вы наследуете другую версию __eq__
из DictMixin
, если вы не переопределите его снова.
x is self
является более быстрым, более прямым и более кратким выражением id(x) == id(self)
, потому что , что - это значение оператора is
- тождество id
(т.е. объект).
Так значит ли это, что a==b
заставляет означать то же самое, что и a is b
, проблему для вашего приложения? Если это так, то наборы просто невозможно использовать для указанного приложения, и вам нужно подумать о какой-то другой, совершенно другой структуре данных (та, которая не основана на хешировании, потому что без переопределения __eq__
вы не сможете заставить хеширование работать правильно).