在 Python 中,自定义类可以通过实现特殊方法 eq 和ne 分别表示 == 和 != 运算符。这使得来自此类的对象能够根据其属性来比较相等性。
实现等价性的一个简单而有效的方法是比较包含对象属性的字典:
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:
对于操作数属于不同类型的情况(无继承),在 eq 和 ne 中返回 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中文网其他相关文章!