首页  >  文章  >  后端开发  >  如何确保我的 Python 类真正相等:等效方法指南

如何确保我的 Python 类真正相等:等效方法指南

DDD
DDD原创
2024-11-08 10:51:01958浏览

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

保持 Python 类相等:等价方法综合指南

在 Python 中,eqne 特殊方法提供了一种方便的方法来定义自定义类的等效性。虽然比较 __dict__ 的基本方法是一个可行的选择,但它可能面临子类以及与其他类型的互操作性的挑战。

更强大的等价处理

为了解决这些问题局限性,考虑更全面的实现:

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 类及其子类之间正确检查等价性。
  • 非交换校正: 它确保相等比较是可交换的,无论操作数如何
  • 哈希覆盖:通过定义自定义的hash方法,可以确保具有相同值的对象具有相同的哈希值,这对于set和字典操作。

验证和测试

为了验证此方法的稳健性,这里有一组断言:

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 类,确保可靠的比较以及准确的集合和字典操作。

以上是如何确保我的 Python 类真正相等:等效方法指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn