首页  >  文章  >  后端开发  >  如何在 Python 类中实现等价:深入探讨 __eq__、__ne__ 和哈希?

如何在 Python 类中实现等价:深入探讨 __eq__、__ne__ 和哈希?

Linda Hamilton
Linda Hamilton原创
2024-11-08 08:12:02363浏览

How to Achieve Equivalence in Python Classes: A Deep Dive into __eq__, __ne__, and Hashing?

在 Python 类中优雅地实现等价

在 Python 中,自定义类可以通过实现特殊方法 eqne 分别表示 == 和 != 运算符。这使得来自此类的对象能够根据其属性来比较相等性。

基本实现

实现等价性的一个简单而有效的方法是比较包含对象属性的字典:

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

    def __ne__(self, other):
        return not self.__eq__(other)

克服陷阱

虽然此方法在同一类的对象之间建立等效性,但在处理不相关类型的子类或实例时面临挑战。要解决这些问题,以下注意事项很重要:

经典样式类的非交换性:

经典样式 Python 2 类执行 eq第一个操作数的 方法,而第二个操作数则调用 ne 。为了确保对称性,请考虑为不支持的操作数类型返回 NotImplemented。

为不支持的类型返回 NotImplemented:

对于操作数属于不同类型的情况(无继承),在 eqne 中返回 NotImplemented 将比较委托给另一个操作数的反射方法。这确保了交换性并允许使用集合来确定唯一实例。

散列和集合处理:

默认情况下,对象使用其对象标识符进行散列。为了确保集合内正确的比较,请重写 hash 以根据对象的属性计算一致的哈希。

更稳健的实现

结合这些考虑因素会产生更稳健的结果对象等价的实现:

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())))

此实现即使在子类和不相关的实例之间也能确保正确的等价和散列,提供更优雅和更全面的方法来支持 Python 类中的等价。

以上是如何在 Python 类中实现等价:深入探讨 __eq__、__ne__ 和哈希?的详细内容。更多信息请关注PHP中文网其他相关文章!

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