Python的object类是否内置了基于ID的相等性判断方法?
Python中object类的相等性判断及实例比较失败分析
核心问题解答
Python的object类确实内置了基于对象ID的相等性判断方法——__eq__。这个默认实现的逻辑很直接:只有当两个变量指向同一个内存地址的对象时,==比较才会返回True,本质上等价于判断id(a) == id(b)。
示例代码分析
你提供的代码里,类A继承自object但没有重写__eq__方法,所以会直接沿用父类的默认逻辑:
class A(object): def __init__(self, i): self.i = i def test_keyset(): i1 = A(1) i2 = A(1) # fails: assert i1 == i2
这里i1和i2是两个独立创建的实例,它们在内存中占据不同的地址(id(i1)和id(i2)返回的值不同),因此调用object.__eq__进行比较时会返回False,断言自然失败。
解决方法
如果希望属性值相同的A类实例被判定为相等,需要手动重写__eq__方法,自定义相等性判断逻辑:
class A(object): def __init__(self, i): self.i = i def __eq__(self, other): # 先判断对方是否是A类实例,避免类型不匹配的错误 if not isinstance(other, A): return NotImplemented # 比较实例的属性值 return self.i == other.i
修改后再执行assert i1 == i2就会成功,因为此时==会调用我们重写的__eq__,只要i属性值相同就返回True。
内容的提问来源于stack exchange,提问作者matanox
相关产品推荐
相关产品推荐

