Сохранение равенства классов Python: полное руководство по методам эквивалентности
В Python eq и ne предоставляют удобный способ определения эквивалентности для пользовательских классов. Хотя базовый подход сравнения __dict__s является жизнеспособным вариантом, он может столкнуться с проблемами, связанными с подклассами и взаимодействием с другими типами.
Более надежная обработка эквивалентности
Для решения этих проблем ограничений, рассмотрите более полную реализацию:
class Number: def __init__(self, number): self.number = number def __eq__(self, other): if isinstance(other, Number): return self.number == other.number return NotImplemented def __ne__(self, other): x = self.__eq__(other) if x is not NotImplemented: return not x return NotImplemented def __hash__(self): return hash(tuple(sorted(self.__dict__.items()))) class SubNumber(Number): pass
Эта версия включает:
Проверка и тестирование
Чтобы проверить надежность этот подход, вот набор утверждений:
n1 = Number(1) n2 = Number(1) n3 = SubNumber(1) n4 = SubNumber(4) assert n1 == n2 assert n2 == n1 assert not n1 != n2 assert not n2 != n1 assert n1 == n3 assert n3 == n1 assert not n1 != n3 assert not n3 != n1 assert not n1 == n4 assert not n4 == n1 assert n1 != n4 assert n4 != n1 assert len(set([n1, n2, n3])) == 1 assert len(set([n1, n2, n3, n4])) == 2
Эти утверждения демонстрируют правильное поведение методов эквивалентности и согласованность хэш-значений.
Принимая Благодаря этому более комплексному подходу вы можете создавать классы Python с надежной обработкой эквивалентности, обеспечивая надежные сравнения и точные операции над множествами и словарями.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3