使用__dict__比较两个对象

时间:2018-04-20 19:19:23

标签: python

有没有理由不这样做来比较两个对象:

def __eq__(self, other):
    return self.get_a() == other.get_a() and self.get_b() == other.get_b() and ...

而不是检查每个属性:

Barrier

最初我有后者,但认为前者是更清洁的解决方案。

2 个答案:

答案 0 :(得分:4)

你可以明确而简洁:

def __eq__(self, other):
    fetcher = operator.attrgetter("a", "b", "c", "d")
    try:
        return self is other or fetcher(self) == fetcher(other)
    except AttributeError:
        return False

只是比较__dict__属性(如果使用__slots__可能不存在),您就会面临对象存在意外属性的风险:

class A:
    def __init__(self, a):
        self.a = a
    def __eq__(self, other):
        return self.__dict__ == other.__dict__

a1 = A(5)
a2 = A(5)
a1.b = 3
assert a1 == a2  # Fails

答案 1 :(得分:0)

一些意见:

您应该包括self is other检查,否则,在某些条件下,内存中的同一对象可以比较不等于自身。 Here是一个示范。评论中提到的实例检查chrisz也是一个好主意。

selfother的dicts可能包含的项目数多于您在第二个版本中手动检查的属性。因此,第一个会慢一些。

(最后,但与问题无关,我们不会在Python中编写getter和setter。使用点符号直接访问属性,如果在获取/设置属性时需要特殊的东西,请使用一个property。)