«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу гарантировать, что мои классы Python действительно равны: руководство по методам эквивалентности

Как я могу гарантировать, что мои классы Python действительно равны: руководство по методам эквивалентности

Опубликовано 14 ноября 2024 г.
Просматривать:268

How Can I Ensure My Python Classes Are Truly Equal: A Guide to Equivalence Methods

Сохранение равенства классов 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

Эта версия включает:

  • Обработку подклассов: Она обеспечивает правильную проверку эквивалентности между классом Number и его подклассами.
  • Некоммутативная коррекция: Это гарантирует, что сравнения на равенство являются коммутативными, независимо от операнда. порядок.
  • Переопределение хэша: Определив собственный метод хеш, он гарантирует, что объекты с одинаковым значением имеют одинаковое значение хеш-функции, что крайне важно для установки и словарные операции.

Проверка и тестирование

Чтобы проверить надежность этот подход, вот набор утверждений:

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