【问题标题】:Python does not consider equivalent objects to be equivalentPython 不认为等价对象是等价的
【发布时间】:2013-12-21 17:32:51
【问题描述】:

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

class fubar(object):
    pass

print(fubar() == fubar())
#False

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

【问题讨论】:

    标签: python class object logic


    【解决方案1】:

    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)
    

    NotImplemented 的返回值表明 fubar 不知道如何进行比较,并给 other 对象一个机会进行比较。

    Python Language ReferenceNotImplemented 有这样的看法:

    这种类型只有一个值。这个有一个对象 价值。该对象通过内置名称访问 未实现。数值方法和丰富的比较方法可能会返回 如果他们不实现操作数的操作,则此值 假如。 (然后解释器将尝试反射操作,或者 其他一些回退,取决于操作员。)它的真值是 真的。

    【讨论】:

      【解决方案2】:

      它们不是同一个对象。例如,检查 id(fubar())id(fubar()) 的值。如果你想重新定义平等的工作方式,你需要实现your own equality method

      class fubar(object):
      
          def __eq__(self, other):
              return True # make this more complex
      

      selfother 相等时,此方法应返回True,否则返回False

      【讨论】:

        【解决方案3】:

        你应该看看this的答案。基本上,定义你的__eq__ 方法来比较对象的self.__dict__,它返回一个包含对象属性的字典。

        【讨论】:

          【解决方案4】:

          如果您想定义自己的比较两个对象的方式,您需要在您的类中添加一个__eq__ 方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-10
            • 2016-08-25
            • 2021-06-19
            • 2010-09-07
            • 2020-07-27
            • 1970-01-01
            相关资源
            最近更新 更多