出于好奇:为什么python3不使用__dict__比较作为默认的相等实现?

时间:2014-10-29 21:48:04

标签: python python-3.x

在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方法实现为基于类的对象的默认值?

这种方法的负面影响是什么?

1 个答案:

答案 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可确保其他对象也有机会实现相等测试。