Python 对象中的自定义相等性比较
Python 的默认行为将对象实例视为不同的实体,即使它们共享相同的属性也是如此。当您想要根据对象的内部属性而不是对象标识来比较对象时,此行为可能会出现问题。以下是如何自定义对象实例的相等性比较:
定义 eq 方法
控制如何比较自定义类的对象是否相等,在类定义中定义 eq 方法。该方法有两个参数:self 和 other。 self 参数指的是当前对象,而 other 表示要与之比较的对象。
<code class="python">class MyClass: def __init__(self, foo, bar): self.foo = foo self.bar = bar def __eq__(self, other): if not isinstance(other, MyClass): # Don't compare to unrelated types return NotImplemented return self.foo == other.foo and self.bar == other.bar</code>
通过实现 __eq__,您实际上是在为类的实例定义自定义相等性检查。在此示例中,该方法比较 self 和 other 的 foo 和 bar 属性,如果它们相等,则返回 True。
实现 eq
实现eq 使类的实例不可散列。这意味着它们不能用作字典中的键或集合中的元素。这是因为Python依靠hash()函数来确定对象是否可散列,而对象的散列值是从其内部内容派生的。由于对象的内容可能会因属性分配而改变,因此无法可靠地对它们进行哈希处理。
如果您正在建模不可变类型,则还应该实现hash 方法以确保一致以及在集合中使用时的可预测行为。
避免通用解决方案
尝试通过迭代dict 并比较值来定义通用相等比较方法不推荐。如果对象的字典中包含不可比较或不可散列的类型,则此方法可能无法正确比较对象。
以上是如何自定义 Python 对象的相等比较?的详细内容。更多信息请关注PHP中文网其他相关文章!