比较两个对象

ima*_*453 18 python

有没有办法检查两个对象是否具有相同的值,除了迭代它们的属性并手动比较它们的值?

小智 9

@Joe Kington的解决方案有效(如果有__dict__一些对象,包括内置__eq__函数,没有一个),并且适用于两个__eq__dicts的所有值(写得很糟糕的异常等).但它是非常不可思议的.它甚至不能正确处理名义上的子类型......更不用说结构子类型(即可以使用的类型/用于鸭子类型).不要这样做.

但通常你最好使用手工定制的__eq__方法,只比较一些重要的属性.例如,Rational应该只比较分子和分母,仅此而已.

  • "一些毫无意义的comparisions可能引发异常":不,这仅适用于涉及排序比较 - 检查`了``等于B`(即'一== B`,明示或暗示的)****从未引起异常(除非你故意编写一个奇怪的类来覆盖`__eq__`,其唯一目的是引起这样的例外;-).IOW,平等/不平等的比较是**永远不会"毫无意义". (2认同)
  • 问题是测试相等性可能完全没有意义,因此在这种情况下引发异常是有责任的!我不止一次地诅咒 Python,因为当我真正想编写 `func()==42` 时没有在 `func==42` 中提出任何内容。但是我们永远不能这样做,即使测试毫无意义,因为我们希望“(True, len, object) 中的东西”同时工作。 (2认同)

hab*_*bit 6

阐述德尔南的答案:

_NOTFOUND = object()

class Rational(object):
    def __eq__(self, other):
        for attr in ['numerator', 'denominator']:
            v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]]
            if v1 is _NOTFOUND or v2 is _NOTFOUND:
                return False
            elif v1 != v2:
                return False
        return True
Run Code Online (Sandbox Code Playgroud)