Python不认为等效对象是等价的

Mic*_*ael 6 python logic class object

我正在腌制,压缩和保存python对象.我希望能够仔细检查我保存的对象是否是在解压缩和去除后返回的完全相同的对象.我认为我的代码中有一个错误,但当我将问题归结为一个可重现的例子时,我发现python并不认为在两个不同的时间点创建的两个看似相同的对象是相等的.这是一个可重复的例子:

class fubar(object):
    pass

print(fubar() == fubar())
#False
Run Code Online (Sandbox Code Playgroud)

为什么python认为这两个对象不相等?检查两个对象确实相同的最pythonic方法是什么?

Ray*_*ger 11

Python中的默认相等比较是检查身份(即两个对象是同一个对象).

根据Python Library Reference:

除非类定义__eq __()方法或__cmp __()方法,否则类的非相同实例通常会比较为不相等.

要创建自己的等价定义,需要定义__eq__方法.这是一种方法:

class fubar(object):

    def __eq__(self, other):
        'Fubar objects are considered equal if they have the same contents'
        if type(self) != type(other):
            return NotImplemented
        return vars(self) == vars(other)
Run Code Online (Sandbox Code Playgroud)

NotImplemented的返回值表示fubar不知道如何进行比较,并且给另一个对象提供了进行比较的机会.

Python语言参考具有这样说NotImplemented:

此类型具有单个值.有一个具有此值的对象.可以通过内置名称NotImplemented访问此对象.如果数值方法和丰富的比较方法未实现所提供操作数的操作,则它们可能会返回此值.(然后,解释器将尝试反射操作或其他一些后备操作,具体取决于操作员.)其真值是真的.