在Python(我使用v 3.4)中,可以使用this == that
测试两个对象的相等性,就像大多数其他语言一样。
比较基于类的对象时,python指的是用于所述比较的类的__eq__
方法。
但是,请执行以下示例:
class Foo:
def __init__(self, bar):
self.bar = bar
one = Foo('text')
two = Foo('text')
调用one == two
将产生False
,因为python只检查身份,而不是数据相等。
这导致您最终实现了大量__eq__
和__ne__
(非等于)方法完全,如下所示:
def __eq__(self, other):
return (isinstance(other, self.__class__)
and self.__dict__ == other.__dict__)
def __ne__(self, other):
return not self.__eq__(other)
为什么我们必须这样做?
有人知道,为什么他们决定不将dict-compare方法实现为基于类的对象的默认值?
这种方法的负面影响是什么?
答案 0 :(得分:3)
为什么我们必须这样做?
因为显性优于隐式。
您假设实例仅基于其属性是相等的;这不一定是规则。例如,使用使用私有属性跟踪缓存数据的类。那些具有大量属性但不需要支持相等的类呢?为什么他们需要支付额外的性能损失?
Python不会做出这样的假设,而是要求您明确定义相等性。这样做的另一个好处是,如果不希望支持实例之间的相等性,则不需要再次禁用这样的相等性测试。
对于简单的情况,可以使用vars(self)
或self.__dict__
,确定:
def __eq__(self, other):
if not isinstance(other, __class__):
return NotImplemented
return vars(self) == vars(other)
def __ne__(self, other):
if not isinstance(other, __class__):
return NotImplemented
return not self.__eq__(other)
返回NotImplemented
可确保其他对象也有机会实现相等测试。