”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何确保我的 Python 类真正相等:等效方法指南

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

发布于2024-11-14
浏览:875

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

验证和测试

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

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