比较两个对象
有没有什么方法可以检查两个对象的值是否相同,而不是一个个属性地去对比它们的值呢?
4 个回答
2
你可以直接比较 namedtuple。
否则,你需要自己定义一些比较的方法,比如 __eq__
(表示相等)和可能的 __ne__
(表示不相等),
或者你可以定义 __cmp__
方法。
想了解更多信息,可以查看 数据模型。
6
为了进一步解释delnan的回答:
_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
11
@Joe Kington的解决方案在对象有__dict__
的时候有效(有些对象,包括内置对象,是没有这个的),而且__eq__
必须对两个字典的所有值都能正常工作(如果__eq__
写得不好,可能会抛出异常等)。但是这种做法非常不符合Python的风格。它甚至不能正确处理名义子类型……更不用说结构子类型了(也就是那些可以用来进行鸭子类型检查的类型)。不要这样做。
通常来说,自己写一个专门的__eq__
方法会更好,这个方法只比较一些重要的属性。例如,Rational类应该只比较分子和分母,其他的就不需要了。